上一篇講了XML基本規則,現在講講XML的解析
1. DOM4J概述
1.1 什麼是DOM4J
Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件採用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j開發,需下載dom4j相應的jar文件。
Dom4j的官方網站:http://sourceforge.net/projects/dom4j/
1.2 搭建Dom4j的開發環境
添加Dom4j的jar包即可:dom4j-1.6.1.jar
使用時注意要導入org.dom4j.*中的類。
2. 使用DOM4J讀取XML文件
2.1 讀取XML文檔的方式
/**
* 獲取document
* @return document
*/
public static Document GetDocument(){
Document document = null;
//方法一:
//1.讀取XML文件,獲得document對象
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(new File("D:\\person.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
/*//方法二:解析XML形式的文本,得到document對象
String xmlText="<person></person>";
try {
document = DocumentHelper.parseText(xmlText);
} catch (DocumentException e) {
e.printStackTrace();
}*/
return document;
}
2.2 遍歷所有元素
public static void testRead() throws Exception {
// 讀入XML文件,並獲取document
Document document = GetDocument();
// 獲取根節點
Element element = document.getRootElement();
// 從根節點開始,遍歷所有的節點(Element是Node的子接口)
traverse(element);
}
// 遍歷所有元素的遞歸方法
public static void traverse(Element element) {
//獲取所以元素的迭代器
Iterator<Element> iter = element.elementIterator();
while(iter.hasNext()){
Element e = iter.next();
System.out.println(e);
traverse(e);
}
}
2.3 查找元素
/**
* 查找元素
* @param elementName 要查找的元素名稱
* @return 返回查找到的元素,null表示沒查找到
*/
public static Element findElement(String elementName) {
// 讀入XML文件,並獲取document
Document document = GetDocument();
// 獲取根節點
Element rootElement = document.getRootElement();
//用來存儲查找到的元素
Element myElement = null;
Iterator<Element> iter = rootElement.elementIterator();
while(iter.hasNext()){
Element ele = iter.next();
//查找到就賦值給myElement
if(ele.getName().equals(elementName)){
myElement = ele;
}
}
return myElement;
}
說明:就可以按照這種方式查找指定特徵的元素或是屬性。
2.4 獲取一個元素的信息
2.4.1 基本信息
/**
* 獲取元素的基本信息
* @param element表示要獲取信息的元素
*/
public static void getElementInfo(Element element){
// 獲取元素的名稱(如果是標籤,則是標籤名;如果是屬性,則是屬性名)
String name = element.getName();
// 獲取元素包含的文本內容(只是指這個標籤體中的文本,如果只有子標籤,則此值爲空字符串)
String text = element.getText();
// 獲取元素包含的所有文本(標籤體中的文本,也包含子孫標籤的文本內容)
String stringValue = element.getStringValue();
// 獲取這個元素的XML源碼
String xml = element.asXML();
}
2.4.2 與子元素有關的
/**
* 關於獲取子元素
* @param parentElement 父元素
*/
public static void childElement(Element parentElement){
// 獲取此元素的所包含的所有節點的數量
int nodeCount = parentElement.nodeCount();
// 獲取此元素所包含的所有子節點的迭代器,包含標籤、註釋、文本等元素
Iterator<Node> nodeIter = parentElement.nodeIterator();
while(nodeIter.hasNext()){
Node node = nodeIter.next();
System.out.println(node.getName());
}
// 獲取此元素的所有子標籤的迭代器,只有標籤元素,不包含註釋與文本元素(迭代器、List集合)
//1.迭代器
Iterator<Element> elementIter = parentElement.elementIterator();
//2.list集合 二選一
List<Element> elementList = parentElement.elements();
}
2.4.3 與屬性有關的
/**
* 獲取元素屬性
* @param element 元素
*/
public static void getAttribute(Element element){
//方法一:
// 獲取此元素的屬性的數量
int attrCount = element.attributeCount();
for(int i=0;i<attrCount;i++){
element.attribute(i);
}
// 獲取此元素的所有屬性(迭代器、List集合)
//方法二:
Iterator<Attribute> attrIter = element.attributeIterator();
//方法三:
List<Attribute> attrList = element.attributes();
}