Java使用Dom4J方式解析XML文件

DOM4J解析与生成XML详解
本文详细介绍了DOM4J库在Java中用于XML处理的使用,包括如何通过pom.xml导入依赖,以及DOM4J的主要API:Document、Element和Attribute。还展示了生成XML的步骤和代码示例,以及解析XML的步骤和代码示例,提供了两种不同的遍历XML节点的方法。此外,文章还给出了两个具体的DOM4J操作XML的代码示例,一个是创建XML文件,另一个是解析XML文件。

一 dom4j介绍

使用方式:在pom.xml中导入dom4j对应的jar

  1. <dependency>

  2. <groupId>dom4j</groupId>

  3. <artifactId>dom4j</artifactId>

  4. <version>1.6.1</version>

  5. </dependency>

 

优点:dom4j使Java生成和解析XML灵活性变高,并且代码易于维护

 

API操作类:

Document:表示xml文档信息,是一个树形结构

Eelment:表示xml的元素结点,提供一些操作其子元素方法的,如文本、属性、名称空间等

Attribute:表示元素结点中的属性

 

二 dom4j生成xml

实现步骤:

第一步:创建一个Document实例

Document doc = DocumentHelper.createDocument();

 

第二步:先添加一个根结点,然后再添加子结点,构造成一个树形结构

Element root = doc.addElement("root");

 

第三步:添加xml文件样式(也可自定义样式),并输出xml文件到指定的路径下

OutputFormat format = OutputFormat.createPrettyPrint();

XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
writer.write(doc);

实现源码:


 
  1. package com.oysept.xml;

  2.  
  3. import java.io.File;

  4. import java.io.FileNotFoundException;

  5. import java.io.FileOutputStream;

  6. import java.io.IOException;

  7. import java.io.UnsupportedEncodingException;

  8.  
  9. import org.dom4j.Document;

  10. import org.dom4j.DocumentHelper;

  11. import org.dom4j.Element;

  12. import org.dom4j.io.OutputFormat;

  13. import org.dom4j.io.XMLWriter;

  14. import org.jdom2.output.Format;

  15.  
  16. /**

  17. * dom4j生成xml

  18. * @author ouyangjun

  19. */

  20. public class CreateDom4j {

  21.  
  22. public static void main(String[] args) {

  23. // 执行dom4j生成xml方法

  24. createDom4j(new File("E:\\dom4j.xml"));

  25. }

  26.  
  27. public static void createDom4j(File file) {

  28. try {

  29. // 创建一个Document实例

  30. Document doc = DocumentHelper.createDocument();

  31.  
  32. // 添加根节点

  33. Element root = doc.addElement("root");

  34.  
  35. // 在根节点下添加第一个子节点

  36. Element oneChildElement= root.addElement("person").addAttribute("attr", "root noe");

  37. oneChildElement.addElement("people")

  38. .addAttribute("attr", "child one")

  39. .addText("person one child one");

  40. oneChildElement.addElement("people")

  41. .addAttribute("attr", "child two")

  42. .addText("person one child two");

  43.  
  44. // 在根节点下添加第一个子节点

  45. Element twoChildElement= root.addElement("person").addAttribute("attr", "root two");

  46. twoChildElement.addElement("people")

  47. .addAttribute("attr", "child one")

  48. .addText("person two child one");

  49. twoChildElement.addElement("people")

  50. .addAttribute("attr", "child two")

  51. .addText("person two child two");

  52.  
  53. // xml格式化样式

  54. // OutputFormat format = OutputFormat.createPrettyPrint(); // 默认样式

  55.  
  56. // 自定义xml样式

  57. OutputFormat format = new OutputFormat();

  58. format.setIndentSize(2); // 行缩进

  59. format.setNewlines(true); // 一个结点为一行

  60. format.setTrimText(true); // 去重空格

  61. format.setPadText(true);

  62. format.setNewLineAfterDeclaration(false); // 放置xml文件中第二行为空白行

  63.  
  64. // 输出xml文件

  65. XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);

  66. writer.write(doc);

  67. System.out.println("dom4j CreateDom4j success!");

  68. } catch (UnsupportedEncodingException e) {

  69. e.printStackTrace();

  70. } catch (FileNotFoundException e) {

  71. e.printStackTrace();

  72. } catch (IOException e) {

  73. e.printStackTrace();

  74. }

  75. }

  76. }

 

三 dom4j解析xml

实现步骤:

第一步:创建一个SAXReader解析器

SAXReader reader = new SAXReader();

 

第二步:解析xml文件,重新构建成一个Document对象

Document doc = reader.read(file);

 

第三步:处理Document对象信息,在控制台打印

 

实现源码:


 
  1. package com.oysept.xml;

  2.  
  3. import java.io.File;

  4. import java.util.Iterator;

  5. import java.util.List;

  6.  
  7. import org.dom4j.Attribute;

  8. import org.dom4j.CDATA;

  9. import org.dom4j.Comment;

  10. import org.dom4j.Document;

  11. import org.dom4j.DocumentException;

  12. import org.dom4j.Element;

  13. import org.dom4j.Node;

  14. import org.dom4j.Text;

  15. import org.dom4j.io.SAXReader;

  16.  
  17. /**

  18. * dom4j解析xml

  19. * @author ouyangjun

  20. */

  21. public class ParseDom4j {

  22.  
  23. public static void main(String[] args) {

  24. // 执行dom4j解析xml方法

  25. parseDom4j(new File("E:\\dom4j.xml"));

  26. }

  27.  
  28. public static void parseDom4j(File file) {

  29. try {

  30. // 创建一个SAXReader解析器

  31. SAXReader reader = new SAXReader();

  32.  
  33. // 读取xml文件,转换成Document结点

  34. Document doc = reader.read(file);

  35.  
  36. // 递归打印xml文档信息

  37. StringBuffer buffer = new StringBuffer();

  38. parseElement(doc.getRootElement(), buffer);

  39. System.out.println(buffer.toString());

  40. } catch (DocumentException e) {

  41. e.printStackTrace();

  42. }

  43. }

  44.  
  45. @SuppressWarnings("unchecked")

  46. public static void parseElement(Element element, StringBuffer buffer) {

  47. buffer.append("<"+element.getName());

  48. List<Attribute> attrs = element.attributes();

  49. if (attrs != null) {

  50. for (Attribute attr : attrs) {

  51. buffer.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");

  52. }

  53. }

  54. buffer.append(">");

  55.  
  56. Iterator<Node> iterator = element.nodeIterator();

  57. while (iterator.hasNext()) {

  58. Node node = iterator.next();

  59. if (node instanceof Element) {

  60. Element eleNode = (Element) node;

  61. parseElement(eleNode, buffer);

  62. }

  63. if (node instanceof Text) {

  64. Text text = (Text) node;

  65. buffer.append(text.getText());

  66. }

  67. if (node instanceof CDATA) {

  68. CDATA dataNode = (CDATA) node;

  69. buffer.append(dataNode.getText());

  70. }

  71. if (node instanceof Comment) {

  72. Comment comNode = (Comment) node;

  73. buffer.append(comNode.getText());

  74. }

  75. }

  76. buffer.append("</"+element.getName()+">");

  77. }

  78. }

 

四 代码示例

示例一:用List列表的方式来解析xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

import java.io.File;

import java.util.List;

 

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

 

 

 

public class Demo {

 

    public static void main(String[] args) throws Exception {

        SAXReader reader = new SAXReader();

        File file = new File("books.xml");

        Document document = reader.read(file);

        Element root = document.getRootElement();

        List<Element> childElements = root.elements();

        for (Element child : childElements) {

            //未知属性名情况下

            /*List<Attribute> attributeList = child.attributes();

            for (Attribute attr : attributeList) {

                System.out.println(attr.getName() + ": " + attr.getValue());

            }*/

             

            //已知属性名情况下

            System.out.println("id: " + child.attributeValue("id"));

             

            //未知子元素名情况下

            /*List<Element> elementList = child.elements();

            for (Element ele : elementList) {

                System.out.println(ele.getName() + ": " + ele.getText());

            }

            System.out.println();*/

             

            //已知子元素名的情况下

            System.out.println("title" + child.elementText("title"));

            System.out.println("author" + child.elementText("author"));

            //这行是为了格式化美观而存在

            System.out.println();

        }

    }

 

}

 

示例二:使用Iterator迭代器的方式来解析xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

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;

 

 

 

public class Demo {

    public static void main(String[] args) throws Exception {

        SAXReader reader = new SAXReader();

        Document document = reader.read(new File("books.xml"));

        Element root = document.getRootElement();

         

        Iterator it = root.elementIterator();

        while (it.hasNext()) {

            Element element = (Element) it.next();

             

            //未知属性名称情况下

            /*Iterator attrIt = element.attributeIterator();

            while (attrIt.hasNext()) {

                Attribute a  = (Attribute) attrIt.next();

                System.out.println(a.getValue());

            }*/

             

            //已知属性名称情况下

            System.out.println("id: " + element.attributeValue("id"));

             

            //未知元素名情况下

            /*Iterator eleIt = element.elementIterator();

            while (eleIt.hasNext()) {

                Element e = (Element) eleIt.next();

                System.out.println(e.getName() + ": " + e.getText());

            }

            System.out.println();*/

             

            //已知元素名情况下

            System.out.println("title: " + element.elementText("title"));

            System.out.println("author: " + element.elementText("author"));

            System.out.println();

        }

    }

}

 

示例三:创建xml文档并输出到文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

import java.io.File;

import java.io.FileOutputStream;

 

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

 

 

public class Demo {

    public static void main(String[] args) throws Exception {

        Document doc = DocumentHelper.createDocument();

        //增加根节点

        Element books = doc.addElement("books");

        //增加子元素

        Element book1 = books.addElement("book");

        Element title1 = book1.addElement("title");

        Element author1 = book1.addElement("author");

         

        Element book2 = books.addElement("book");

        Element title2 = book2.addElement("title");

        Element author2 = book2.addElement("author");

         

        //为子节点添加属性

        book1.addAttribute("id""001");

        //为元素添加内容

        title1.setText("Harry Potter");

        author1.setText("J K. Rowling");

         

        book2.addAttribute("id""002");

        title2.setText("Learning XML");

        author2.setText("Erik T. Ray");

         

        //实例化输出格式对象

        OutputFormat format = OutputFormat.createPrettyPrint();

        //设置输出编码

        format.setEncoding("UTF-8");

        //创建需要写入的File对象

        File file = new File("D:" + File.separator + "books.xml");

        //生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式

        XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);

        //开始写入,write方法中包含上面创建的Document对象

        writer.write(doc);

    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值