DOM4J介绍与代码示例 (强大的xml处理工具)
生活随笔
收集整理的這篇文章主要介紹了
DOM4J介绍与代码示例 (强大的xml处理工具)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DOM4J是dom4j.org出品的一個開源XML解析包。Dom4j是一個易用的、開源的庫,用于XML,XPath和XSLT。它應用于Java平臺,采用了Java集合框架并完全支持DOM,SAX和JAXP。關鍵 牛逼的 oracle 也在使用。
DOM4J下載jar包:http://downloads.sourceforge.net/dom4j/dom4j-1.6.1.jar
JAXEN(對XPath的支持):http://dist.codehaus.org/jaxen/distributions/jaxen-1.1.1.zip
1.DOM4J主要接口
DOM4J主要接口都在org.dom4j這個包里定義。
-Node為所有的dom4j中XML節點定義了多態行為;
-Branch為能夠包含子節點的節點如XML元素(Element)和文檔(Docuemnts)定義了一個公共的行為;
|-Element 定義XML 元素;
|-Document定義了XML文檔;
-DocumentType 定義XML DOCTYPE聲明;
-Entity定義 XML entity;
-Attribute定義了XML的屬性;
-ProcessingInstruction 定義 XML 處理指令;
-CharacterData是一個標識借口,標識基于字符的節點。如CDATA,Comment, Text;
|- CDATA 定義了XML CDATA 區域;
|-Text 定義XML 文本節點;
|- Comment 定義了XML注釋的行為;
項目結構
?
maven代碼
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>lqy</groupId><artifactId>Dom4jTest</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>Dom4jTest</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.4</version></dependency></dependencies> </project>?
1.創建XML文檔
package lqy.Dom4jTest;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter;/** 創建XML文檔*/ public class XmlGen {/** 方法generateDocumentByMethod()通過調用方法構建xml文檔:1.使用DocumentHelper得到Document實例Document document = DocumentHelper.createDocument();2.創建Processing Instructiondocument.addProcessingInstruction("xml-stylesheet", inMap);3.創建元素ElementElement studentsElement = document.addElement("students");4.為元素添加注釋CommentstudentsElement.addComment("An Student Catalog");5.為元素添加屬性studentsElement.addComment("An Student Catalog");6.為元素添加文本值TextageElement.setText("18");*/public Document generateDocumentByMethod() {Document document = DocumentHelper.createDocument();// ProcessingInstructionMap<String, String> inMap = new HashMap<String, String>();inMap.put("type", "text/xsl");inMap.put("href", "students.xsl");document.addProcessingInstruction("xml-stylesheet", inMap);// root elementElement studentsElement = document.addElement("students");studentsElement.addComment("An Student Catalog");// son elementElement stuElement = studentsElement.addElement("student");stuElement.addAttribute("sn", "01");Element nameElement = stuElement.addElement("name");nameElement.setText("sam");Element ageElement = stuElement.addElement("age");ageElement.setText("18");// son elementElement anotherStuElement = studentsElement.addElement("student");anotherStuElement.addAttribute("sn", "02");Element anotherNameElement = anotherStuElement.addElement("name");anotherNameElement.setText("lin");Element anotherAgeElement = anotherStuElement.addElement("age");anotherAgeElement.setText("20");return document;}/** 方法generateDocumentByString()通過字符串轉換直接構建xml文檔,使用DocumentHelper.parseText()來實現.* document = DocumentHelper.parseText(text);*/public Document generateDocumentByString() {String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +"<?xml-stylesheet type=\"text/xsl\" href=\"students.xsl\"?>" +"<students><!--An Student Catalog--> <student sn=\"01\">" +"<name>sam</name><age>18</age></student><student sn=\"02\">" +"<name>lin</name><age>20</age></student></students>";Document document = null;try {document = DocumentHelper.parseText(text);} catch (DocumentException e) {e.printStackTrace();}return document;}public void saveDocument(Document document, File outputXml) {try {// 美化格式OutputFormat format = OutputFormat.createPrettyPrint();/*// 縮減格式OutputFormat format = OutputFormat.createCompactFormat();*//*// 指定XML編碼format.setEncoding("GBK");*/XMLWriter output = new XMLWriter(new FileWriter(outputXml), format);output.write(document);output.close();} catch (IOException e) {System.out.println(e.getMessage());}}public static void main(String[] argv) {XmlGen dom4j = new XmlGen();Document document = null;//通過方法生成document=dom4j.generateDocumentByMethod();//通過字符串生成//document = dom4j.generateDocumentByString(); dom4j.saveDocument(document, new File("students-gen.xml"));} }?
生成students-gen.xml如下
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="students.xsl"?><students><!--An Student Catalog--><student sn="01"><name>sam</name><age>18</age></student><student sn="02"><name>lin</name><age>20</age></student> </students>?
方法generateDocumentByMethod()通過調用方法構建xml文檔: 1.使用DocumentHelper得到Document實例 Document document = DocumentHelper.createDocument(); 2.創建Processing Instruction document.addProcessingInstruction("xml-stylesheet", inMap); 3.創建元素Element Element studentsElement = document.addElement("students"); 4.為元素添加注釋Comment studentsElement.addComment("An Student Catalog"); 5.為元素添加屬性 studentsElement.addComment("An Student Catalog"); 6.為元素添加文本值Text ageElement.setText("18"); 方法generateDocumentByString()通過字符串轉換直接構建xml文檔,使用DocumentHelper.parseText()來實現. document = DocumentHelper.parseText(text); 方法saveDocument(Document document, File outputXml)將文檔輸出到文件保存,可指定字符編碼,可指定格式化輸出。2.修改XML文檔
package lqy.Dom4jTest; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import java.util.List;import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;/** 這里使用xpath來定位待修改的元素和屬性,需要jaxen的支持。*示例中將students-gen.xml的第一個student元素的sn屬性改為001,其子元素name內容改為jeff。*XmlMod.java*/ public class XmlMod {/** 1.使用File定位文件資源,并基于此獲得Document實例*SAXReader saxReader = new SAXReader();*Document document = saxReader.read(inputXml);*2.Document實例的selectNodes方法可以傳入xpath,并返回一個List實例,基于此使用迭代器,完成特定的應用*List list = document.selectNodes("//students/student/@sn");*/public void modifyDocument(File inputXml) {try {SAXReader saxReader = new SAXReader();Document document = saxReader.read(inputXml);List list = document.selectNodes("//students/student/@sn");Iterator iter = list.iterator();while (iter.hasNext()) {Attribute attribute = (Attribute) iter.next();if (attribute.getValue().equals("01"))attribute.setValue("001");}list = document.selectNodes("//students/student");iter = list.iterator();while (iter.hasNext()) {Element element = (Element) iter.next();Iterator iterator = element.elementIterator("name");while (iterator.hasNext()) {Element nameElement = (Element) iterator.next();if (nameElement.getText().equals("sam"))nameElement.setText("jeff");}}XMLWriter output = new XMLWriter(new FileWriter(new File("students-modified.xml")));output.write(document);output.close();}catch (DocumentException e) {System.out.println(e.getMessage());} catch (IOException e) {System.out.println(e.getMessage());}}/** selectSingleNode如果有多個只取第一個*/public void modifyDocument2(File inputXml){SAXReader saxReader = new SAXReader();try {Document document = saxReader.read(inputXml);Node nodeAttr=document.selectSingleNode("//students/student/@sn");System.out.println(nodeAttr.getText());nodeAttr.setText("nodeAttr");Node nodeEle=document.selectSingleNode("//students/student");System.out.println(nodeEle.getText());nodeEle.setText("nodeEle"); XMLWriter output = new XMLWriter(new FileWriter(new File("students-modified2.xml")));output.write(document); output.close(); } catch (Exception e) {e.printStackTrace();}}public static void main(String[] argv) {XmlMod dom4jParser = new XmlMod();//dom4jParser.modifyDocument(new File("students-gen.xml"));dom4jParser. modifyDocument2(new File("students-gen.xml"));} }?
生成students-modified.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="students.xsl"?><students><!--An Student Catalog--> <student sn="001"><name>jeff</name><age>18</age></student><student sn="02"><name>lin</name><age>20</age></student> </students>生成students-modified2.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="students.xsl"?><students><!--An Student Catalog--> <student sn="nodeAttr"><name>sam</name><age>18</age>nodeEle</student><student sn="02"><name>lin</name><age>20</age></student> </students>?
1.使用File定位文件資源,并基于此獲得Document實例 SAXReader saxReader =?new?SAXReader(); Document document = saxReader.read(inputXml); 2.Document實例的selectNodes方法可以傳入xpath,并返回一個List實例,基于此使用迭代器,完成特定的應用 List list = document.selectNodes("//students/student/@sn");?
3.遍歷XML文檔
這里提供兩種遍歷方法,一種是基于迭代的遍歷,一種是基于Visitor模式的遍歷。這里介紹迭代的?
package lqy.Dom4jTest;import java.io.File; import java.util.Iterator;import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader;/** 方法traversalDocumentByIterator()提供一種基于迭代的遍歷實現,每個Element通過elementIterator()和attributeIterator()取代其子元素和屬性的迭代器。*/ public class XmlIterator {private File inputXml;public XmlIterator(File inputXml) {this.inputXml = inputXml;}public static void main(String[] argv) {XmlIterator dom4jParser = new XmlIterator(new File("students-gen.xml"));dom4jParser.traversalDocumentByIterator();}public Element getRootElement() {return getDocument().getRootElement();}public Document getDocument() {SAXReader saxReader = new SAXReader();Document document = null;try {document = saxReader.read(inputXml);} catch (Exception e) {e.printStackTrace();}return document;}/** 該方法只是枚舉了兩層,如果一直挖的話要用遞歸方法*/public void traversalDocumentByIterator() {Element root = getRootElement();// 枚舉根節點下所有子節點for (Iterator ie = root.elementIterator(); ie.hasNext();) {System.out.println("======");Element element = (Element) ie.next();System.out.println(element.getName());// 枚舉屬性for (Iterator ia = element.attributeIterator(); ia.hasNext();) {Attribute attribute = (Attribute) ia.next();System.out.println(attribute.getName() + ":"+ attribute.getData());}// 枚舉當前節點下所有子節點for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {Element elementSon = (Element) ieson.next();System.out.println(elementSon.getName() + ":"+ elementSon.getText());}}}}輸出
?
4.通過Element找到節點
package lqy.Dom4jTest;import java.io.File; import java.util.Iterator; import java.util.List;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader;public class XmlReadByElement {/*** @param args* @throws Exception */public static void main(String[] args) throws Exception {XmlReadByElement.getOneEle();XmlReadByElement.getEles();XmlReadByElement.getAttrs();XmlReadByElement.getOneAttr();}public static Document getDocument() throws Exception{SAXReader reader = new SAXReader();Document document = reader.read(new File("students-read.xml"));return document;}//要順序一個一個往下找public static void getOneEle() throws Exception{Document document=getDocument();Element rootElm = document.getRootElement();Element e=rootElm.element("lqy");System.out.println("arrt:"+e.attributeValue("aa"));Element e2=e.element("login");System.out.println("text:"+e2.getText());}public static void getEles() throws Exception{Document document=getDocument();Element rootElm = document.getRootElement();List eList=rootElm.elements("student");Iterator it=eList.iterator();while(it.hasNext()){Element elm=(Element)it.next();System.out.println("arrt:"+elm.attributeValue("sn"));}}public static void getOneAttr() throws Exception{Document document=getDocument();Node node1=document.selectSingleNode("//students/lqy/login");Element elm=(Element)node1;System.out.println("attr:"+elm.attributeValue("sn"));}public static void getAttrs() throws Exception{Document document=getDocument();List list = document.selectNodes("//students/student");Iterator it=list.iterator();while(it.hasNext()){Element elm=(Element)it.next();System.out.println("attr:"+elm.attributeValue("sn"));}}}?
students-read.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="students.xsl"?><students><!--An Student Catalog--><student sn="01"><name>sam</name><age>18</age></student><student sn="02"><name>lin</name><age>20</age></student><lqy aa="123123123"><login sn="03">luo</login><pass>123456</pass></lqy> </students>輸出結果
?
5.通過XPath找到節點
package lqy.Dom4jTest;import java.io.File; import java.util.Iterator; import java.util.List;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader;public class XmlReadByXPath {/*** @param args* @throws Exception */public static void main(String[] args) throws Exception {XmlReadByXPath.getOneEleByXPath();XmlReadByXPath.getElesByXPath();XmlReadByXPath.getAttrsByXPath();XmlReadByXPath.getOneAttrByXPath();}public static Document getDocument() throws Exception{SAXReader reader = new SAXReader();Document document = reader.read(new File("students-read.xml"));return document;}public static void getOneEleByXPath() throws Exception{Document document=getDocument();Node node1=document.selectSingleNode("//students/lqy/login");String nodeText1=node1.getText();System.out.println("nodeText1:"+nodeText1);//假如多個只返回第一個Node node2=document.selectSingleNode("//students/student/name");String nodeText2=node2.getText();System.out.println("nodeText2:"+nodeText2);Node node3=document.selectSingleNode("//students/student/@sn");short nodeText3=node1.ATTRIBUTE_NODE;System.out.println("nodeText3:"+nodeText3);}public static void getElesByXPath() throws Exception{Document document=getDocument();List list = document.selectNodes("//students/student/name");Iterator it=list.iterator();while(it.hasNext()){Element elm=(Element)it.next();System.out.println("elm:"+elm.getText());}}public static void getOneAttrByXPath() throws Exception{Document document=getDocument();Node node1=document.selectSingleNode("//students/lqy/login");Element elm=(Element)node1;System.out.println("attr:"+elm.attributeValue("sn"));}public static void getAttrsByXPath() throws Exception{Document document=getDocument();List list = document.selectNodes("//students/student");Iterator it=list.iterator();while(it.hasNext()){Element elm=(Element)it.next();System.out.println("attr:"+elm.attributeValue("sn"));}}}輸出結果
?
6.XML轉換成String
package lqy.Dom4jTest;import java.io.File; import java.util.Iterator; import java.util.List;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader;public class XMLToString {/*** @param args* @throws Exception */public static void main(String[] args) throws Exception {SAXReader reader = new SAXReader();Document document = reader.read(new File("students-read.xml")); String docXmlText=document.asXML();System.out.println(docXmlText);System.out.println("------------------docXmlText-------------------");Element root=document.getRootElement(); String rootXmlText=root.asXML();System.out.println(rootXmlText);System.out.println("------------------rootXmlText-------------------");Element memberElm=root.element("lqy");String memberXmlText=memberElm.asXML();System.out.println(memberXmlText);System.out.println("------------------memberXmlText-------------------");}}?
?輸出
??
?
參考
1.http://zhangjunhd.blog.51cto.com/113473/126310
2.http://www.blogjava.net/junglesong/archive/2008/02/21/181196.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的DOM4J介绍与代码示例 (强大的xml处理工具)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信可以开店了!谁开心,谁忧伤
- 下一篇: 《真爱西游》火云洞副本心得