欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

DOM4J介绍与代码示例 (强大的xml处理工具)

发布时间:2023/12/19 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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处理工具)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。