(一)XML解析技術(shù)
解析:用java等技術(shù)將xml文件中有用的信息提取出來(lái)的過(guò)程。
現(xiàn)常用的有兩大類別:
- DOM類別: 一次性將硬盤中的xml文件加載到內(nèi)存中形成一顆倒?fàn)顦?shù),從根節(jié)點(diǎn)開(kāi)始從上向下遍歷,獲取有用節(jié)點(diǎn)的內(nèi)容。
- SAX類別:分多次將硬盤中的xml文件加載到內(nèi)存中,以事件的方式去解析節(jié)點(diǎn)中有用的內(nèi)容。
在這里我們選擇XML解析器:dom4.j;dom4.j開(kāi)發(fā)包叫:dom4.j-1.6.1.jar導(dǎo)入到你的工程的CLASSPATH路徑下
(二)DOM4.J簡(jiǎn)單介紹
1、Dom4j是一個(gè)簡(jiǎn)單、靈活的開(kāi)放源代碼的庫(kù)。Dom4j是由早期開(kāi)發(fā)JDOM的人分離出來(lái)而后獨(dú)立開(kāi)發(fā)的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對(duì)要復(fù)雜一些,但它提供了比JDOM更好的靈活性
2、Dom4j是一個(gè)非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極易使用的特點(diǎn)。現(xiàn)在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
3、使用Dom4j開(kāi)發(fā),需下載dom4j相應(yīng)的jar文件
(三)DOM4J解析案例
- 1、獲得document的三種方式
(1)讀取
(2)字符串轉(zhuǎn)換
(3)新建對(duì)象
(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)建一個(gè)內(nèi)存中的document對(duì)象,表示硬盤中的xml文件
Document xmlDocument = DocumentHelper.createDocument();
//將內(nèi)存中的document文件寫入硬盤中,形成一個(gè)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)新建對(duì)象
public static void main(String[] args) throws Exception {
//新創(chuàng)建對(duì)象,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é)點(diǎn)和其子節(jié)點(diǎn)
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對(duì)象,指向硬盤中的xml文件
InputStream is = new FileInputStream(new File("E:/new.xml"));
Document xmlDocument = saxReader.read(is);
//獲取根節(jié)點(diǎn)
Element rootElement = xmlDocument.getRootElement();
//輸出根節(jié)點(diǎn)名字
System.out.println(rootElement.getName());
//獲取根節(jié)點(diǎn)下面的直接子節(jié)點(diǎn)個(gè)數(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、遍歷每個(gè)子節(jié)點(diǎn)屬性和標(biāo)簽中的內(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é)點(diǎn)的屬性和內(nèi)容
//創(chuàng)建dom4.j解析器
SAXReader saxReader = new SAXReader();
/*Document xmlDocument = saxReader.read(new File("E:/new.xml"));*/
//創(chuàng)建InputStream對(duì)象,指向硬盤中的XML文件
InputStream is = new FileInputStream(new File("E:/book.xml"));
//通過(guò)字節(jié)流對(duì)象,加載硬盤中的XML文件到內(nèi)存中
Document xmlDocument = saxReader.read(is);
//獲取根節(jié)點(diǎn)
Element rootElement = xmlDocument.getRootElement();
//顯示根節(jié)點(diǎn)的名字
System.out.println(rootElement.getName());
//獲取根節(jié)點(diǎn)下面的直接子節(jié)點(diǎn)個(gè)數(shù)和名字
List<Element> elementList = rootElement.elements("book");
//子節(jié)點(diǎn)個(gè)數(shù)
System.out.println(elementList.size());
/*System.out.println(elementList.size());*/
for(Element element : elementList){
//分別輸出子節(jié)點(diǎn)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é)點(diǎn)的id屬性
String id = element.attributeValue("id");
System.out.println(id);
}
}
}

(四)將Document對(duì)象寫入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對(duì)象,指向硬盤中的xml文件
InputStream is = new FileInputStream(new File("E:/book.xml"));
Document xmlDocument = saxReader.read(is);
/*
* 第一種方法
*
//將DOUCMENT對(duì)象存放入硬盤中,形成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快速定位
若一個(gè)xml文檔里有著多層次標(biāo)簽的時(shí)候,想要定位到某個(gè)標(biāo)簽的內(nèi)容時(shí),使用dom4.j只能夠依次尋找從上到下,比較繁瑣。因此,使用XPATH
1、XPATH是啥?
XPATH是一門在xml文檔中查找信息的語(yǔ)言,可用來(lái)對(duì)其中的元素和屬性進(jìn)行遍歷,簡(jiǎn)化了dom4.j查找節(jié)點(diǎn)的過(guò)程
2、XPATH語(yǔ)法

3、查詢節(jié)點(diǎn)
(1)獲取所有符合條件的節(jié)點(diǎn):selectNode()返回一個(gè)List集合
(2)獲取符合條件的單個(gè)節(jié)點(diǎn):selectSingleNode(xpath)返回一個(gè)Node元素,一般需要轉(zhuǎn)換成Element類型,若有多個(gè)出現(xiàn)的話,只取其中一個(gè)。