解析XML之DOM4J

前端之家收集整理的这篇文章主要介绍了解析XML之DOM4J前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

  1. DOM4Jdom4j.org出品的一个开源XML解析包,Dom4j是一个易用的,开源的库,用于XML,XPathXSLT它应用于Java平台,采用了Java集合框架并完全支持DOM,SAXJAXP
  2. DOM4J架包下载
  3. http://downloads.sourceforge.net/dom4j/dom4j-1.6.1.jar
  4. DOM4J在线API
  5. http://www.javasoft.ch/dom4j-2.0.0-beta/apidocs/org/dom4j/package-summary.html
  6. jaxen(对XPath支持)
  7. http://dist.codehaus.org/jaxen/distributions/jaxen-1.1.1.zip

Dom4j的主要接口

  1. Node
  2. 为所有的dom4jXML节点定义了多态行为
  3. Branch
  4. 为能够包含子节点的节点,如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为
  5. Element定义XML 元素
  6. Document定义了XML文档
  7. DocumentType
  8. 定义XML DOCTYPE声明
  9. Entity
  10. 定义 XML entity
  11. Attribute
  12. 定义了XML属性
  13. ProcessingInstruction
  14. 定义 XML 处理指令
  15. CharacterData
  16. 是一个标识接口,标识基于字符的节点,如CDATA,Comment,Text
  17. CDATA定义了XML CDATA区域
  18. Text定义XML文本节点
  19. Comment定义了XML注释的行为

创建XML文件的两种方法

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE student SYSTEM "dom4j.dtd">
  3. <students>
  4. <student>
  5. <name>lwc</name>
  6. <sex>boy</sex>
  7. <age>20</age>
  8. </student>
  9. <student>
  10. <name>nxj</name>
  11. <sex>girl</sex>
  12. <age>18</age>
  13. </student>
  14. </students>

转换字符串创建

  1. package com.itlwc;
  2.  
  3. import java.io.File;
  4. import java.io.FileWriter;
  5.  
  6. import org.dom4j.Document;
  7. import org.dom4j.DocumentHelper;
  8. import org.dom4j.io.OutputFormat;
  9. import org.dom4j.io.XMLWriter;
  10.  
  11. public class Dom4jTest {
  12. public static void main(String[] args) {
  13. String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
  14. "<!DOCTYPE student SYSTEM \"dom4j.dtd\">"+
  15. "<students>" +
  16. "<student>" +
  17. "<name>lwc</name>" +
  18. "<sex>boy</sex>" +
  19. "<age>20</age>" +
  20. "</student>" +
  21. "<student>" +
  22. "<name>nxj</name>" +
  23. "<sex>girl</sex>" +
  24. "<age>18</age>" +
  25. "</student>" +
  26. "</students>";
  27. try {
  28. //解析XML,得到文档
  29. Document document = DocumentHelper.parseText(xml);
  30. //创建默认漂亮输出格式
  31. OutputFormat format = OutputFormat.createPrettyPrint();
  32. File file = new File("output.xml");
  33. //将文档输出文件保存,可指定字符编码,可指定格式化输出
  34. XMLWriter output = new XMLWriter(new FileWriter(file),format);
  35. output.write(document);
  36. output.close();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

Dom4j的方法创建

  1. package com.itlwc;
  2.  
  3. import java.io.File;
  4. import java.io.FileWriter;
  5.  
  6. import org.dom4j.Document;
  7. import org.dom4j.DocumentHelper;
  8. import org.dom4j.Element;
  9. import org.dom4j.io.OutputFormat;
  10. import org.dom4j.io.XMLWriter;
  11.  
  12. public class Dom4jTest {
  13. public static void main(String[] args) {
  14. try {
  15. // 得到文档实例
  16. Document document = DocumentHelper.createDocument();
  17. document.addDocType("student","","dom4j.dtd");
  18. // 创建元素
  19. Element studentsElement = document.addElement("students");
  20. Element student1Element = studentsElement.addElement("student");
  21. Element name1Element = student1Element.addElement("name");
  22. name1Element.setText("lwc");
  23. Element sex1Element = student1Element.addElement("sex");
  24. sex1Element.setText("boy");
  25. Element age1Element = student1Element.addElement("age");
  26. age1Element.setText("20");
  27.  
  28. Element student2Element = studentsElement.addElement("student");
  29. Element name2Element = student2Element.addElement("name");
  30. name2Element.setText("nxj");
  31. Element sex2Element = student2Element.addElement("sex");
  32. sex2Element.setText("girl");
  33. Element age2Element = student2Element.addElement("age");
  34. age2Element.setText("18");
  35.  
  36. // 创建默认漂亮输出格式
  37. OutputFormat format = OutputFormat.createPrettyPrint();
  38. File file = new File("output.xml");
  39. // 将文档输出文件保存,format);
  40. output.write(document);
  41. output.close();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

修改XML文件

  1. package com.itlwc;
  2.  
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.util.Iterator;
  6. import java.util.List;
  7.  
  8. import org.dom4j.Document;
  9. import org.dom4j.Element;
  10. import org.dom4j.io.SAXReader;
  11. import org.dom4j.io.XMLWriter;
  12.  
  13. public class Dom4jTest {
  14. public static void main(String[] args) {
  15. try {
  16. SAXReader saxReader = new SAXReader();
  17. File file = new File("output.xml");
  18. // 定位资源文件获取document实例
  19. Document document = saxReader.read(file);
  20. // Document实例的selectNodes方法可以传入xpath,并返回一个List实例
  21. List list = document.selectNodes("//students/student");
  22. Iterator iter = list.iterator();
  23. while (iter.hasNext()) {
  24. Element element = (Element) iter.next();
  25. Iterator iterName = element.elementIterator("name");
  26. while (iterName.hasNext()) {
  27. Element nameElement = (Element) iterName.next();
  28. if ("lwc".equals(nameElement.getText())) {
  29. // 修改文本
  30. nameElement.setText("itlwc");
  31. }
  32. }
  33. }
  34. // 从新保存文件
  35. XMLWriter output = new XMLWriter(new FileWriter(new File(
  36. "students-modified.xml")));
  37. output.write(document);
  38. output.close();
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. /*
  45. output.xml
  46. <?xml version="1.0" encoding="UTF-8"?>
  47. <students>
  48. <student no="1001">
  49. <name>lwc</name>
  50. <sex>boy</sex>
  51. <age>20</age>
  52. </student>
  53. <student no="1002">
  54. <name>nxj</name>
  55. <sex>girl</sex>
  56. <age>18</age>
  57. </student>
  58. </students>
  59. students-modified.xml
  60. <?xml version="1.0" encoding="UTF-8"?>
  61. <students>
  62. <student no="1001">
  63. <name>itlwc</name>
  64. <sex>boy</sex>
  65. <age>20</age>
  66. </student>
  67. <student no="1002">
  68. <name>nxj</name>
  69. <sex>girl</sex>
  70. <age>18</age>
  71. </student>
  72. </students>
  73. */

遍历XML文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <students>
  3. <student no="1001">
  4. <name>lwc</name>
  5. <sex>boy</sex>
  6. <age>20</age>
  7. </student>
  8. <student no="1002">
  9. <name>nxj</name>
  10. <sex>girl</sex>
  11. <age>18</age>
  12. </student>
  13. </students>

使用迭代遍历

  1. package com.itlwc;
  2.  
  3. import java.io.File;
  4. import java.util.Iterator;
  5.  
  6. import org.dom4j.Attribute;
  7. import org.dom4j.Document;
  8. import org.dom4j.Element;
  9. import org.dom4j.io.SAXReader;
  10.  
  11. public class Dom4jTest {
  12. public static void main(String[] args) {
  13. try {
  14. SAXReader saxReader = new SAXReader();
  15. File file = new File("output.xml");
  16. // 定位资源文件获取document实例
  17. Document document = saxReader.read(file);
  18. // 获取根元素students
  19. Element root = document.getRootElement();
  20. System.out.println(root.getName());
  21. // 枚举根节点下所有子节点student
  22. Iterator iteStudent = root.elementIterator();
  23. while (iteStudent.hasNext()) {
  24. Element elementStudent = (Element) iteStudent.next();
  25. System.out.println(elementStudent.getName());
  26.  
  27. // 枚举根节点下所有子节点student的子节点
  28. Iterator iteSonNode = elementStudent.elementIterator();
  29. while (iteSonNode.hasNext()) {
  30. Element elementSon = (Element) iteSonNode.next();
  31. System.out.println(elementSon.getName() + ":"
  32. + elementSon.getText());
  33. }
  34.  
  35. // 枚举根节点下所有子节点student的属性
  36. Iterator iteSonAttribute = elementStudent.attributeIterator();
  37. while (iteSonAttribute.hasNext()) {
  38. Attribute attribute = (Attribute) iteSonAttribute.next();
  39. System.out.println(attribute.getName() + ":"
  40. + attribute.getData());
  41. }
  42. }
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. /*
  49. 打印结果:
  50. students
  51. student
  52. name:lwc
  53. sex:boy
  54. age:20
  55. no:1001
  56. student
  57. name:nxj
  58. sex:girl
  59. age:18
  60. no:1002
  61. */

使用观察者模式遍历

  1. VisitorGOF设计模式之一,其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable
  2. DOM4J中的Visitor模式只需要自定一个类实现Visitor接口即可
  3. public class MyVisitor extends VisitorSupport {
  4. public void visit(Element element) {
  5. System.out.println(element.getName());
  6. }
  7. public void visit(Attribute attr) {
  8. System.out.println(attr.getName());
  9. }
  10. }
  11. 调用:root.accept(new MyVisitor())
  12. Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问
  13. 上面是给出的ElementAttribute的简单实现,一般比较常用的就是这两个
  14. VisitorSupportDOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码
  15. 注意,这个Visitor自动遍历所有子节点的,如果是root.accept(MyVisitor),将遍历子节点
案例
  1. package com.itlwc;
  2.  
  3. import java.io.File;
  4.  
  5. import org.dom4j.Attribute;
  6. import org.dom4j.Document;
  7. import org.dom4j.Element;
  8. import org.dom4j.ProcessingInstruction;
  9. import org.dom4j.VisitorSupport;
  10. import org.dom4j.io.SAXReader;
  11.  
  12. /**
  13. * 定义自己的访问者类
  14. */
  15. class MyVisitor extends VisitorSupport {
  16. // 对于属性节点,打印属性的名字和值
  17. public void visit(Attribute node) {
  18. System.out.println("attribute : " + node.getName() + " = "
  19. + node.getValue());
  20. }
  21.  
  22. // 对于处理指令节点,打印处理指令目标和数据
  23. public void visit(ProcessingInstruction node) {
  24. System.out.println("PI : " + node.getTarget() + " " + node.getText());
  25. }
  26.  
  27. // 对于元素节点,判断是否只包含文本内容,如是,则打印标记的名字和 元素的内容,如果不是,则只打印标记的名字
  28. public void visit(Element node) {
  29. if (node.isTextOnly()) {
  30. System.out.println("element : " + node.getName() + " = "
  31. + node.getText());
  32. } else {
  33. System.out.println("-----" + node.getName() + "-----");
  34. }
  35. }
  36. }
  37.  
  38. public class Dom4jTest {
  39. public static void main(String[] args) {
  40. try {
  41. SAXReader saxReader = new SAXReader();
  42. File file = new File("output.xml");
  43. // 定位资源文件获取document实例
  44. Document document = saxReader.read(file);
  45. document.accept(new MyVisitor());
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. /*
  52. 打印结果:
  53. -----students-----
  54. -----student-----
  55. attribute : no = 1001
  56. element : name = lwc
  57. element : sex = boy
  58. element : age = 20
  59. -----student-----
  60. attribute : no = 1002
  61. element : name = nxj
  62. element : sex = girl
  63. element : age = 18
  64. */

猜你在找的XML相关文章