(一)XML解析技術(shù)
解析:用java等技術(shù)將xml文件中有用的信息提取出來的過程。
現(xiàn)常用的有兩大類別:
- DOM類別: 一次性將硬盤中的xml文件加載到內(nèi)存中形成一顆倒狀樹,從根節(jié)點開始從上向下遍歷,獲取有用節(jié)點的內(nèi)容。
- SAX類別:分多次將硬盤中的xml文件加載到內(nèi)存中,以事件的方式去解析節(jié)點中有用的內(nèi)容。
在這里我們選擇XML解析器:dom4.j;dom4.j開發(fā)包叫:dom4.j-1.6.1.jar導入到你的工程的CLASSPATH路徑下
(二)DOM4.J簡單介紹
1、Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發(fā)JDOM的人分離出來而后獨立開發(fā)的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要復(fù)雜一些,但它提供了比JDOM更好的靈活性
2、Dom4j是一個非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強大和極易使用的特點。現(xiàn)在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
3、使用Dom4j開發(fā),需下載dom4j相應(yīng)的jar文件
(三)DOM4J解析案例
- 1、獲得document的三種方式
(1)讀取
(2)字符串轉(zhuǎn)換
(3)新建對象
(1)讀取
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.XMLWriter;
public class Demo01 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//將內(nèi)存中的xml文件寫入硬盤中去
//創(chuàng)建一個內(nèi)存中的document對象,表示硬盤中的xml文件
Document xmlDocument = DocumentHelper.createDocument();
//將內(nèi)存中的document文件寫入硬盤中,形成一個xml文件
XMLWriter xmlWriter = new XMLWriter(
new FileOutputStream(new File("E:/new123.xml"))
);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
結(jié)果:
(2)字符串轉(zhuǎn)換
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//type01();
//字符串轉(zhuǎn)換
String str = "<root><city>廣州</city></root>";
Document xmlDocument = DocumentHelper.parseText(str);
XMLWriter xmlWriter = new XMLWriter(
new FileOutputStream(new File("E:/book1.xml"))
);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
(3)新建對象
public static void main(String[] args) throws Exception {
//新創(chuàng)建對象,dom4.j核心解析器
SAXReader saxReader = new SAXReader();
Document xmlDocument = saxReader.read(new File("E:/book.xml"));
System.out.println(xmlDocument !=null?"已讀到xml文件":"未讀取到xml文件");
}
結(jié)果:
- 2、獲得根節(jié)點和其子節(jié)點
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo02 {
public static void main(String[] args) throws Exception {
//創(chuàng)建dom4.j解析器
SAXReader saxReader = new SAXReader();
//創(chuàng)建InputStream對象,指向硬盤中的xml文件
InputStream is = new FileInputStream(new File("E:/new.xml"));
Document xmlDocument = saxReader.read(is);
//獲取根節(jié)點
Element rootElement = xmlDocument.getRootElement();
//輸出根節(jié)點名字
System.out.println(rootElement.getName());
//獲取根節(jié)點下面的直接子節(jié)點個數(shù)和名字
List<Element> listElement = rootElement.elements("city");
System.out.println(listElement.size());
for(int i = 0;i<listElement.size();i++){
System.out.println(listElement.get(i).getText());
}
}
}
- 3、遍歷每個子節(jié)點屬性和標簽中的內(nèi)容
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo03 {
public static void main(String[] args) throws Exception {
//遍歷子節(jié)點的屬性和內(nèi)容
//創(chuàng)建dom4.j解析器
SAXReader saxReader = new SAXReader();
/*Document xmlDocument = saxReader.read(new File("E:/new.xml"));*/
//創(chuàng)建InputStream對象,指向硬盤中的XML文件
InputStream is = new FileInputStream(new File("E:/book.xml"));
//通過字節(jié)流對象,加載硬盤中的XML文件到內(nèi)存中
Document xmlDocument = saxReader.read(is);
//獲取根節(jié)點
Element rootElement = xmlDocument.getRootElement();
//顯示根節(jié)點的名字
System.out.println(rootElement.getName());
//獲取根節(jié)點下面的直接子節(jié)點個數(shù)和名字
List<Element> elementList = rootElement.elements("book");
//子節(jié)點個數(shù)
System.out.println(elementList.size());
/*System.out.println(elementList.size());*/
for(Element element : elementList){
//分別輸出子節(jié)點title,price,author的內(nèi)容
String titleElement = element.element("title").getText().trim();
System.out.println(titleElement);
String priceElement = element.element("price").getText().trim();
System.out.println(priceElement);
String authorElement = element.element("author").getText().trim();
System.out.println(authorElement);
//子節(jié)點的id屬性
String id = element.attributeValue("id");
System.out.println(id);
}
}
}
(四)將Document對象寫入XML文件
- 文檔中全為英文,不設(shè)置編碼,直接寫入的形式
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
- 文檔中含有中文,設(shè)置編碼格式寫入的形式
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Demo04 {
public static void main(String[] args) throws Exception {
//創(chuàng)建dom4.j解析器
SAXReader saxReader = new SAXReader();
//創(chuàng)建InputStream對象,指向硬盤中的xml文件
InputStream is = new FileInputStream(new File("E:/book.xml"));
Document xmlDocument = saxReader.read(is);
/*
* 第一種方法
*
//將DOUCMENT對象存放入硬盤中,形成xml文件
XMLWriter writer = new XMLWriter(new FileWriter("e:/newbook.xml"));
writer.write(xmlDocument);
writer.close();
*
*/
//第二種方法
OutputFormat format = OutputFormat.createCompactFormat();
OutputStream os = new FileOutputStream(new File("e:/newbook.xml"));
XMLWriter xmlWriter = new XMLWriter(os, format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
(五)XPATH快速定位
若一個xml文檔里有著多層次標簽的時候,想要定位到某個標簽的內(nèi)容時,使用dom4.j只能夠依次尋找從上到下,比較繁瑣。因此,使用XPATH
1、XPATH是啥?
XPATH是一門在xml文檔中查找信息的語言,可用來對其中的元素和屬性進行遍歷,簡化了dom4.j查找節(jié)點的過程
2、XPATH語法
3、查詢節(jié)點
(1)獲取所有符合條件的節(jié)點:selectNode()返回一個List集合
(2)獲取符合條件的單個節(jié)點:selectSingleNode(xpath)返回一個Node元素,一般需要轉(zhuǎn)換成Element類型,若有多個出現(xiàn)的話,只取其中一個。