Java开发之路

文章32 |   阅读 14698 |   点赞0

来源:https://blog.csdn.net/sunnyyoona

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

x33g5p2x  于2021-03-13 发布在 其他  
字(12.1k)|赞(0)|评价(0)|浏览(361)

1.JDOM解析XML文档

1.1 简介

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。

JDOM帮助文档 : http://www.jdom.org/docs/apidocs/

Jar包下载地址:点击打开链接

1.2 解析步骤

(1)创建SAXBuilder对象

  1. SAXBuilder saxBuilder = new SAXBuilder();

(2)创建输入流对象并将XML文档加载到输入流中

  1. FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml");

(3)通过saxBuilder对象的build方法将输入流加载到saxBuilder中(注意:Document 所引用的包是org.jdom2.Document;)

  1. Document document = saxBuilder.build(inputStream);

(4)通过document对象获取XML文档的根节点

  1. Element rootElement = document.getRootElement();

(5)根据根节点获取根节点下的子节点集合

  1. List<Element> bookList = rootElement.getChildren();

(6)根据节点获取属性节点集合

  1. List<Attribute> attrList = book.getAttributes();

(7)根据节点(元素节点或者属性节点)获取节点名称和节点值

  1. // 属性名称
  2. node.getName();
  3. // 属性值
  4. node.getValue();

1.3 主要方法

(1)返回文档的根节点

public Element getRootElement()

  1. // document为Document对象
  2. Element rootElement = document.getRootElement();

(2)返回节点的所有子节点的集合

public java.util.List<Element> getChildren()

  1. // rootElement为Element对象
  2. List<Element> bookList = rootElement.getChildren();

(3)返回节点的所有属性节点的集合

public java.util.List<Attribute> getAttributes()

  1. // book为Element对象
  2. List<Attribute> attrList = book.getAttributes()

(4)根据子节点的名称返回节点的子节点

public Element getChild(java.lang.String cname)

  1. Element titleElement = book.getChild("title");

(5)返回节点的名称

public java.lang.String getName()

  1. // titleElement为title节点
  2. titleElement.getName();

(6)返回节点值

public java.lang.String getValue()、

  1. titleElement.getValue()

DOM方式getNodeValue() 对于元素节点时返回null。不同于DOM方式,JDOM无论是属性节点还是元素节点都会返回节点对应的文本值。

  1. <author>Scott Meyers</author>

对于这个节点来说,DOM的getNodeValue()返回null,JDOM的getValue()返回"Scott Meyers"。

1.3 具体实例

  1. package com.qunar.xml;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.util.List;
  6. import org.jdom2.Attribute;
  7. import org.jdom2.Document;
  8. import org.jdom2.Element;
  9. import org.jdom2.JDOMException;
  10. import org.jdom2.input.SAXBuilder;
  11. /**
  12. * JDOM解析XML文档
  13. * @author sjf0115
  14. *
  15. */
  16. public class JDOMXMLCode {
  17. public static void main(String[] args) {
  18. try {
  19. // 创建SAXBuilder对象
  20. SAXBuilder saxBuilder = new SAXBuilder();
  21. // 创建输入流对象并将XML文档加载到输入流中
  22. FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml");
  23. // 通过saxBuilder对象的build方法将输入流加载到saxBuilder中
  24. Document document = saxBuilder.build(inputStream);
  25. // 通过document对象获取XML文档的根节点
  26. Element rootElement = document.getRootElement();
  27. // 根据根节点获取根节点下的子节点集合
  28. List<Element> bookList = rootElement.getChildren();
  29. // 遍历子节点
  30. for (Element book : bookList) {
  31. System.out.println("开始解析一本书...");
  32. // 解析属性
  33. List<Attribute> attrList = book.getAttributes();
  34. for (Attribute attribute : attrList) {
  35. // 属性名称
  36. System.out.print("---" + attribute.getName() + ":");
  37. // 属性值
  38. System.out.println(attribute.getValue());
  39. }//for
  40. // 获取book节点下的子节点
  41. List<Element> bookChildren = book.getChildren();
  42. for (Element bookChild : bookChildren) {
  43. // 节点名称
  44. System.out.print("------" + bookChild.getName() + ":");
  45. // 节点值
  46. System.out.println(bookChild.getValue());
  47. }//for
  48. System.out.println("结束解析一本书...");
  49. }//for
  50. } catch (FileNotFoundException e) {
  51. e.printStackTrace();
  52. } catch (JDOMException e) {
  53. e.printStackTrace();
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }

运行结果:

<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包下载地址:点击打开链接

2.2解析

(1)创建SAXReader对象

  1. SAXReader saxReader = new SAXReader();

(2)通过SaxReader对象的read方法加载XML文档获取Document对象

  1. Document document = saxReader.read(new File("D:\\bookstore.xml"));

(3)通过Document对象获取根节点

  1. Element bookstore = document.getRootElement();

(4)通过Element对象的elementIterator方法获取迭代器

  1. Iterator iterator = bookstore.elementIterator();

(5)遍历迭代器获取根节点的信息

  1. while (iterator.hasNext()) {
  2. // 获取下一个子节点
  3. Element book = (Element)iterator.next();
  4. }

(6)获取属性节点的属性名称和属性值

  1. // 获取book的属性节点集合
  2. List<Attribute> bookAttr = book.attributes();
  3. // 遍历book属性节点
  4. for (Attribute attribute : bookAttr) {
  5. // 获取book的属性节点的属性名称以及属性值
  6. System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue());
  7. }//for

(7)获取元素节点的节点名称和对应的文本值

  1. Iterator ite = book.elementIterator();
  2. // 遍历book节点的子节点
  3. while(ite.hasNext()){
  4. // book节点的子节点
  5. Element bookChild = (Element)ite.next();
  6. System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue());
  7. //System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText());
  8. }//while

2.3 具体案例

  1. package com.qunar.xml;
  2. import java.io.File;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import org.dom4j.Attribute;
  6. import org.dom4j.Document;
  7. import org.dom4j.DocumentException;
  8. import org.dom4j.Element;
  9. import org.dom4j.io.SAXReader;
  10. public class DOM4JXMLCode {
  11. public static void main(String[] args) {
  12. try {
  13. // 创建SAXReader对象
  14. SAXReader saxReader = new SAXReader();
  15. // 通过SaxReader对象的read方法加载XML文档获取Document对象
  16. Document document = saxReader.read(new File("D:\\bookstore.xml"));
  17. // 通过Document对象获取根节点
  18. Element bookstore = document.getRootElement();
  19. // 通过Element对象的elementIterator方法获取迭代器
  20. Iterator iterator = bookstore.elementIterator();
  21. // 遍历根节点的子节点
  22. while (iterator.hasNext()) {
  23. System.out.println("开始解析一本书...");
  24. // 获取下一个元素节点
  25. Element book = (Element)iterator.next();
  26. // 获取book的属性节点集合
  27. List<Attribute> bookAttr = book.attributes();
  28. // 遍历book属性节点
  29. for (Attribute attribute : bookAttr) {
  30. // 获取book的属性节点的属性名称以及属性值
  31. System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue());
  32. }//for
  33. Iterator ite = book.elementIterator();
  34. // 遍历book节点的子节点
  35. while(ite.hasNext()){
  36. // book节点的子节点
  37. Element bookChild = (Element)ite.next();
  38. System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue());
  39. //System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText());
  40. }//while
  41. System.out.println("结束解析一本书...");
  42. }
  43. } catch (DocumentException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }

运行结果:

<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>

相关文章