【學習筆記】關於DOM4J:使用DOM4J解析XML文檔
一、概述
DOM4J是一個易用的、開源的庫,用於XML、XPath和XSLT中。采用了Java集合框架並完全支持DOM、SAX、和JAXP。
DOM4J最大的特色是使用大量的接口,主要接口都在org.dom4j這個包裏定義:
二、DOM4J的接口
Attribute:定義了XML的屬性;
Branch:是能夠包含子節點的節點,如XML元素(Element)和文檔(Documents)定義了一個公共的行為;
CDATA:定義了XML的CDATA區域;
CharacterData:是一個標識接口,標致基於字符的節點:(CDATA、Comment、Text);
Comment:定義了XML註釋的行為;
Document:定義了XML文檔;
DocumentType:定義了XML的DOCTYPE聲明;
Element:定義了XML文檔;
ElementHandler:定義了Element對象的處理器;
ElementPath:被ElementHandler使用,用於取得當前正在處理的路徑層次信息;
Entity:定義XML的entity;
Node:為所有的DOM4J中XML節點定義了多態行為;
NodeFilter:定義了在DOM4J節點中產生的一個濾鏡或謂詞的行為(predicate);
ProcessingInstruction:定義XML處理指令;
Text:定義XML文本節點;
Visitor:用於實現Visitor模式;
XPath:在分析一個字符串後會提供一個XPath表達式。
三、使用DOM4J操作XML數據
1.Document對象相關
讀取XML文件,獲得document對象。
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.節點相關
獲取文檔的根元素
Element rootElm = document.getRootElement();
取得某節點的單個子節點
Element memberElm = root.element("member");//"member"是節點名
取得節點的文字
String text = memberElm.getText();
String text = root.elementText("name");//取得根元素下的name子節點的文字
取得某節點下名為“member”的所有子節點並進行遍歷
List nodes = rootElm.elements("member");
for(Iterator it=nodes.iterator;it.hasNext();){
Element elm = (Element)it.next();
}
對某節點下的所有子節點進行遍歷
for(Iterator it = root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
}
在某節點下添加子節點
Element ageElm = newMemberElm.addElement("age");
設置節點文字
ageElm.setText("29");
刪除某節點
parentElm.remove(childElm);//childElm是待刪除的節點,parentElm是其父節點
3.相關屬性
取得某節點下的屬性
Element root = document.getRootElement();
Attribute attribute = root.attribute("size");//屬性名name
取得屬性的文字
String text = attribute.getText();
String text = root.element("name").attributeValue("firstname");
遍歷某節點的所有屬性
Element root = document.getRootElement();
for(Iterator it = root.attributeIterator();it.hasNext();{
Attribute attribute = (Attribute)it.next();
String text = attribute.getText();
System.out.println(text);
}
設置某節點的屬性和文字
newMemberElm.addAttribute("name","sitinspring");
設置屬性的文字
Attribute attribute = root.attribute("name");
attribute.setText("sitinspring");
刪除某屬性
Attribute attribute = root.attribute("size");
root.remove(attribute);
4.將文檔寫入XML文件
(1)文檔中全為英文,不設置編碼格式,直接寫入
XMLWriter writer = new XMLWriter(new FileWriter("output.xml");
writer.write(document);
writer.close();
(2)文檔中含有中文,設置編碼格式在寫入
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
writer.write(document);
writer.close();
四、案例:使用DOM4J讀取XML文檔,步驟如下:
1.導入DOM4J的jar包
2.指定要解析的XML文件
3.把XML文件轉換成Document對象
4.獲取節點屬性或文本的值
1 import java.io.File; 2 import java.util.Iterator; 3 4 import org.dom4j.Document; 5 import org.dom4j.DocumentException; 6 import org.dom4j.Element; 7 import org.dom4j.io.SAXReader; 8 9 /** 10 * 使用DOM4J解析XML文檔 11 * @author Administrator 12 * 13 */ 14 public class PhoneDom4j { 15 16 public static void main(String[] args) { 17 Document phone = null; 18 try { 19 //加載DOM樹 20 SAXReader saxReader = new SAXReader(); 21 phone = saxReader.read(new File("src/phoneInfo.xml")); 22 } catch (DocumentException e) { 23 e.printStackTrace(); 24 } 25 //獲取xml的根節點 26 Element root = phone.getRootElement(); 27 //遍歷所有的Brand標簽 28 for (Iterator<?> itBrand = root.elementIterator(); itBrand.hasNext();) { 29 Element brand = (Element) itBrand.next(); 30 //輸出標簽的屬性 31 System.out.println("品牌:"+brand.attributeValue("name")); 32 //遍歷Type標簽 33 for (Iterator<?> itType = brand.elementIterator(); itType.hasNext();) { 34 Element type = (Element) itType.next(); 35 //輸出標簽的name屬性 36 System.out.println("\t型號:"+type.attributeValue("name")); 37 } 38 } 39 40 } 41 42 }
【學習筆記】關於DOM4J:使用DOM4J解析XML文檔