[Java开发之路](12)JDOM和DOM4J解析XML文档

最后更新于:2022-04-01 09:59:50

### 1.JDOM解析XML文档 1.1 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。 JDOM帮助文档 : [http://www.jdom.org/docs/apidocs/](http://www.jdom.org/docs/apidocs/) Jar包下载地址:[点击打开链接](http://download.csdn.net/detail/sunnyyoona/9387707) 1.2 解析步骤 (1)创建SAXBuilder对象 ~~~ SAXBuilder saxBuilder = new SAXBuilder(); ~~~ (2)创建输入流对象并将XML文档加载到输入流中 ~~~ FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml"); ~~~ (3)通过saxBuilder对象的build方法将输入流加载到saxBuilder中(注意:Document 所引用的包是org.jdom2.Document;) ~~~ Document document = saxBuilder.build(inputStream); ~~~ (4)通过document对象获取XML文档的根节点 ~~~ Element rootElement = document.getRootElement(); ~~~ (5)根据根节点获取根节点下的子节点集合 ~~~ List<Element> bookList = rootElement.getChildren(); ~~~ (6)根据节点获取属性节点集合 ~~~ List<Attribute> attrList = book.getAttributes(); ~~~ (7)根据节点(元素节点或者属性节点)获取节点名称和节点值 ~~~ // 属性名称 node.getName(); // 属性值 node.getValue(); ~~~ 1.3 主要方法 (1)返回文档的根节点 public Element getRootElement() ~~~ // document为Document对象 Element rootElement = document.getRootElement(); ~~~ (2)返回节点的所有子节点的集合 public java.util.List<Element> getChildren() ~~~ // rootElement为Element对象 List<Element> bookList = rootElement.getChildren(); ~~~ (3)返回节点的所有属性节点的集合 public java.util.List<Attribute> getAttributes() ~~~ // book为Element对象 List<Attribute> attrList = book.getAttributes() ~~~ (4)根据子节点的名称返回节点的子节点 public Element getChild(java.lang.String cname) ~~~ Element titleElement = book.getChild("title"); ~~~ (5)返回节点的名称 public java.lang.String getName() ~~~ // titleElement为title节点 titleElement.getName(); ~~~ (6)返回节点值 public java.lang.String getValue()、 ~~~ titleElement.getValue() ~~~ DOM方式getNodeValue() 对于元素节点时返回null。不同于DOM方式,JDOM无论是属性节点还是元素节点都会返回节点对应的文本值。 ~~~ <author>Scott Meyers</author> ~~~ 对于这个节点来说,DOM的getNodeValue()返回null,JDOM的getValue()返回"Scott Meyers"。 1.3 具体实例 ~~~ package com.qunar.xml; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; /** * JDOM解析XML文档 * @author sjf0115 * */ public class JDOMXMLCode { public static void main(String[] args) { try { // 创建SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); // 创建输入流对象并将XML文档加载到输入流中 FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml"); // 通过saxBuilder对象的build方法将输入流加载到saxBuilder中 Document document = saxBuilder.build(inputStream); // 通过document对象获取XML文档的根节点 Element rootElement = document.getRootElement(); // 根据根节点获取根节点下的子节点集合 List<Element> bookList = rootElement.getChildren(); // 遍历子节点 for (Element book : bookList) { System.out.println("开始解析一本书..."); // 解析属性 List<Attribute> attrList = book.getAttributes(); for (Attribute attribute : attrList) { // 属性名称 System.out.print("---" + attribute.getName() + ":"); // 属性值 System.out.println(attribute.getValue()); }//for // 获取book节点下的子节点 List<Element> bookChildren = book.getChildren(); for (Element bookChild : bookChildren) { // 节点名称 System.out.print("------" + bookChild.getName() + ":"); // 节点值 System.out.println(bookChild.getValue()); }//for System.out.println("结束解析一本书..."); }//for } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ~~~ **运行结果:** <table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:942px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:941px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">开始解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">---category:Java</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------title:Java多线程编程核心技术</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------author:高洪岩</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------year:2015</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------price:69.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">结束解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">开始解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">---category:C++</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------title:Effective C++: 55 Specific Ways to Improve Your Programs and Designs</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------author:Scott Meyers</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------year:2006</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------price:58.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">结束解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">开始解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">---category:Web</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------title:Learning XML</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------author:Erik T. Ray</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------year:2016</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">------price:39.95</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">结束解析一本书...</span></div></td></tr></tbody></table> ### 2.DOM4J解析XML文档 2.1 简介 DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。如今可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。 Jar包下载地址:[点击打开链接](http://download.csdn.net/detail/sunnyyoona/9388272) 2.2解析 (1)创建SAXReader对象 ~~~ SAXReader saxReader = new SAXReader(); ~~~ (2)通过SaxReader对象的read方法加载XML文档获取Document对象 ~~~ Document document = saxReader.read(new File("D:\\bookstore.xml")); ~~~ (3)通过Document对象获取根节点 ~~~ Element bookstore = document.getRootElement(); ~~~ (4)通过Element对象的elementIterator方法获取迭代器 ~~~ Iterator iterator = bookstore.elementIterator(); ~~~ (5)遍历迭代器获取根节点的信息 ~~~ while (iterator.hasNext()) { // 获取下一个子节点 Element book = (Element)iterator.next(); } ~~~ (6)获取属性节点的属性名称和属性值 ~~~ // 获取book的属性节点集合 List<Attribute> bookAttr = book.attributes(); // 遍历book属性节点 for (Attribute attribute : bookAttr) { // 获取book的属性节点的属性名称以及属性值 System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue()); }//for ~~~ (7)获取元素节点的节点名称和对应的文本值 ~~~ Iterator ite = book.elementIterator(); // 遍历book节点的子节点 while(ite.hasNext()){ // book节点的子节点 Element bookChild = (Element)ite.next(); System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue()); //System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText()); }//while ~~~ 2.3 具体案例 ~~~ package com.qunar.xml; import java.io.File; 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.io.SAXReader; public class DOM4JXMLCode { public static void main(String[] args) { try { // 创建SAXReader对象 SAXReader saxReader = new SAXReader(); // 通过SaxReader对象的read方法加载XML文档获取Document对象 Document document = saxReader.read(new File("D:\\bookstore.xml")); // 通过Document对象获取根节点 Element bookstore = document.getRootElement(); // 通过Element对象的elementIterator方法获取迭代器 Iterator iterator = bookstore.elementIterator(); // 遍历根节点的子节点 while (iterator.hasNext()) { System.out.println("开始解析一本书..."); // 获取下一个元素节点 Element book = (Element)iterator.next(); // 获取book的属性节点集合 List<Attribute> bookAttr = book.attributes(); // 遍历book属性节点 for (Attribute attribute : bookAttr) { // 获取book的属性节点的属性名称以及属性值 System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue()); }//for Iterator ite = book.elementIterator(); // 遍历book节点的子节点 while(ite.hasNext()){ // book节点的子节点 Element bookChild = (Element)ite.next(); System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue()); //System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText()); }//while System.out.println("结束解析一本书..."); } } catch (DocumentException e) { e.printStackTrace(); } } } ~~~ **运行结果:** <table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:942px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:941px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">开始解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:category   value:Java</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:title   value:Java多线程编程核心技术</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:author   value:高洪岩</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:year   value:2015</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:price   value:69.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">结束解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">开始解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:category   value:C++</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:title   value:Effective C++: 55 Specific Ways to Improve Your Programs and Designs</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:author   value:Scott Meyers</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:year   value:2006</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:price   value:58.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">结束解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">开始解析一本书...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:category   value:Web</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:title   value:Learning XML</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:author   value:Erik T. Ray</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:year   value:2016</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">name:price   value:39.95</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">结束解析一本书...</span></div></td></tr></tbody></table>
';