java读取html生成xml_java 解析并生成 XML

本文详细介绍了如何在Java中利用Dom4j解析和操作XML文件。内容包括理解XML文件的树结构,掌握Dom4j的主要接口,如通过SAXReader读取XML,使用Document获取根元素,以及遍历和操作XML节点的方法,如ElementHandler和XPath。此外,还提供了三个示例,分别展示了用List和Iterator方式解析XML,以及创建并输出XML到文件的实践代码。
摘要由CSDN通过智能技术生成

在 java 中使用 Dom4j 解析 XML

对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具。

在此只介绍下 Dom4j 对 XML 文件的解析使用方法。

1. 明白了解 XML 文件的树结构

2. 了解 DOM4J 的一些接口

1. XML 文件的树结构(附:XML :http://www.w3school.com.cn/xml/xml_tree.asp)

XML 文档形成一种树结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

所有元素均可拥有子元素:

1

2

3 .....

4

5

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。

所有元素均可拥有文本内容和属性(类似 HTML 中)。

实例:

469c3c37cf95ccd59d4285067caf4544.png

上图表示下面的 XML 中的一本书:

1

2

3 Everyday Italian

4 Giada De Laurentiis

5 2005

6 30.00

7

8

9 Harry Potter

10 J K. Rowling

11 2005

12 29.99

13

14

15 Learning XML

16 Erik T. Ray

17 2003

18 39.95

19

20

例子中的根元素是 。文档中的所有 元素都被包含在 中。

元素有 4 个子元素:、< author>、、。

所以,对 XML 文件的解析,无非就是从 XML 文件中获取到根元素与子元素。

对此Dom4j 已经对一些需要使用的方法进行了封装。

2. 了解DOM4J的一些接口 (附:http://www.blogjava.net/i369/articles/154264.html)

读取并解析XML文档:

1 //从文件读取XML,输入文件名,返回XML文档

2 public Document read(String fileName) throwsMalformedURLException, DocumentException {3 SAXReader reader = newSAXReader();4 Document document = reader.read(newFile(fileName));5 returndocument;6 }

其中,reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就带表了整个XML。

2.  取得 root 结点

1 publicElement getRootElement(Document doc){2 returndoc.getRootElement();3 }4

使用 getRootElement 直接可以返回root结点.

3. 遍历 XML 树

DOM4J提供至少3种遍历节点的方法,在此只取两种方法进行记录.

1) 枚举

1 //枚举所有子节点

2 for ( Iterator i =root.elementIterator(); i.hasNext(); ) {3 Element element =(Element) i.next();4 //do something

5 }6 //枚举名称为foo的节点

7 for ( Iterator i =root.elementIterator(foo); i.hasNext();) {8 Element foo =(Element) i.next();9 //do something

10 }11 //枚举属性

12 for ( Iterator i =root.attributeIterator(); i.hasNext(); ) {13 Attribute attribute =(Attribute) i.next();14 //do something

15 }

2) 递归

1 public voidtreeWalk() {2 treeWalk(getRootElement());3 }4 public voidtreeWalk(Element element) {5 for (int i = 0, size = element.nodeCount(); i < size; i++) {6 Node node =element.node(i);7 if (node instanceofElement) {8 treeWalk((Element) node);9 } else { //do something....

10 }11 }12 }

附:

Attribute

Attribute定义了XML的属性

Branch

Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,

CDATA

CDATA 定义了XML CDATA 区域

CharacterData

CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text.

Comment

Comment 定义了XML注释的行为

Document

定义了XML文档

DocumentType

DocumentType 定义XML DOCTYPE声明

Element

Element定义XML 元素

ElementHandler

ElementHandler定义了 Element 对象的处理器

ElementPath

被 ElementHandler 使用,用于取得当前正在处理的路径层次信息

Entity

Entity定义 XML entity

Node

Node为所有的dom4j中XML节点定义了多态行为

NodeFilter

NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)

ProcessingInstruction

ProcessingInstruction 定义 XML 处理指令.

Text

Text 定义XML 文本节点.

Visitor

Visitor 用于实现Visitor模式.

XPath

XPath 在分析一个字符串后会提供一个XPath 表达式

实例:附:)http://www.cnblogs.com/nerxious/archive/2013/05/04/3060263.html

在使用过程中需要下载:DOM4J*点击下载

首先我们需要出创建一个xml文档,然后才能对其解析

XML文档:

1 <?xml version="1.0" encoding="UTF-8"?>

2

3

4 8G

5 200

6 1580

7

8

9

10 10G

11 500

12 3000

13

14

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

1 packagedom;2

3 importjava.io.File;4 importjava.util.List;5 importorg.dom4j.Document;6 importorg.dom4j.Element;7 importorg.dom4j.io.SAXReader;8

9

10 public classDemo {11

12 public static void main(String[] args) throwsException {13 SAXReader reader = newSAXReader();14 File file = new File("test.xml");15 Document document =reader.read(file);16 Element root =document.getRootElement();17 List childElements =root.elements();18 for(Element child : childElements) {19 //未知属性名情况下

20 /*List attributeList = child.attributes();21 for (Attribute attr : attributeList) {22 System.out.println(attr.getName() + ": " + attr.getValue());23 }*/

24

25 //已知属性名情况下

26 System.out.println("name: " + child.attributeValue("name"));27

28 //未知子元素名情况下

29 /*List elementList = child.elements();30 for (Element ele : elementList) {31 System.out.println(ele.getName() + ": " + ele.getText());32 }33 System.out.println();*/

34

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

36 System.out.println("capacity: " + child.elementText("capacity"));37 System.out.println("directories: " + child.elementText("directories"));38 System.out.println("files: " + child.elementText("files"));39 //这行是为了格式化美观而存在

40 System.out.println();41 }42 }43

44 }

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

1 packagedom;2

3 importjava.io.File;4 importjava.util.Iterator;5 importorg.dom4j.Document;6 importorg.dom4j.Element;7 importorg.dom4j.io.SAXReader;8

9 public classDemo1 {10 public static void main(String[] args) throwsException {11 SAXReader reader = newSAXReader();12 Document document = reader.read(new File("test.xml"));13 Element root =document.getRootElement();14

15 Iterator it =root.elementIterator();16 while(it.hasNext()) {17 Element element =(Element) it.next();18

19 //未知属性名称情况下

20 /*Iterator attrIt = element.attributeIterator();21 while (attrIt.hasNext()) {22 Attribute a = (Attribute) attrIt.next();23 System.out.println(a.getValue());24 }*/

25

26 //已知属性名称情况下

27 System.out.println("name: " + element.attributeValue("name"));28

29 //未知元素名情况下

30 /*Iterator eleIt = element.elementIterator();31 while (eleIt.hasNext()) {32 Element e = (Element) eleIt.next();33 System.out.println(e.getName() + ": " + e.getText());34 }35 System.out.println();*/

36

37 //已知元素名情况下

38 System.out.println("capacity: " + element.elementText("capacity"));39 System.out.println("directories: " + element.elementText("directories"));40 System.out.println("files: " + element.elementText("files"));41 System.out.println();42 }43 }44 }

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

1 packagedom;2

3 importjava.io.File;4 importjava.io.FileOutputStream;5

6 importorg.dom4j.Document;7 importorg.dom4j.DocumentHelper;8 importorg.dom4j.Element;9 importorg.dom4j.io.OutputFormat;10 importorg.dom4j.io.XMLWriter;11

12

13 public classDemo2 {14 public static void main(String[] args) throwsException {15 Document doc =DocumentHelper.createDocument();16 //增加根节点

17 Element HD = doc.addElement("HD");18 //增加子元素

19 Element disk = HD.addElement("disk");20 Element capacity1 = disk.addElement("capacity");21 Element directories1 = disk.addElement("directories");22 Element files1 = disk.addElement("files");23

24 Element disk2 = HD.addElement("disk");25 Element capacity2 = disk2.addElement("capacity");26 Element directories2 = disk2.addElement("directories");27 Element files2 = disk2.addElement("files");28

29

30

31 //为子节点添加属性

32 disk.addAttribute("name", "C");33 //为元素添加内容

34 capacity1.setText("8G");35 directories1.setText("2000");36 files1.setText("1580");37

38 disk2.addAttribute("name", "D");39 //为元素添加内容

40 capacity1.setText("10G");41 directories1.setText("500");42 files1.setText("3000");43

44 //实例化输出格式对象

45 OutputFormat format =OutputFormat.createPrettyPrint();46 //设置输出编码

47 format.setEncoding("UTF-8");48 //创建需要写入的File对象

49 File file = new File("D:" + File.separator + "test.xml");50 //生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式

51 XMLWriter writer = new XMLWriter(newFileOutputStream(file), format);52 //开始写入,write方法中包含上面创建的Document对象

53 writer.write(doc);54 }55 }

对 XML 文件的解析 和 对生成 XML 文件,关键在于对 XML 树结构的理解.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值