dom4j解析XML
来源:互联网 发布:淘宝返利设置 编辑:程序博客网 时间:2024/05/17 13:13
dom4j解析XML
dom4j 是一种解析 XML 文档的开放源代码 XML 框架,与 W3C DOM API 相比,使用 dom4j 所包含的解析器的好处是 dom4j 拥有本地的 XPath 支持.DOM 解析器不支持使用 XPath 选择节点.该解析器可以从 http://dom4j.org/ 获取. 它的网站中这样定义:
Dom4j isan easy to use, open source library for working with XML, XPath and XSLT on theJava platform using the Java Collections Framework and with full support forDOM, SAX and JAXP.
Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南只有短短一页(html),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法,如需深入的使用,请……自己摸索或查找别的资料。
之前看过IBMdeveloper社区的文章(参见附录),提到一些XML解析包的性能比较,其中DOM4J的性能非常出色,在多项测试中名列前茅。(事实上DOM4J的官方文档中也引用了这个比较)所以这次的项目中我采用了DOM4J作为XML解析工具。
在国内比较流行的是使用JDOM作为解析器,两者各擅其长,但DOM4J最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。大师不是说过么,“面向接口编程”。目前使用DOM4J的已经越来越多。如果你善于使用JDOM,不妨继续用下去,只看看本篇文章作为了解与比较,如果你正要采用一种解析器,不如就用DOM4J吧。
它的主要接口都在org.dom4j这个包里定义:
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 表达式
看名字大致就知道它们的涵义如何了。
要想弄懂这套接口,关键的是要明白接口的继承关系:
o interface java.lang.Cloneable
o interface org.dom4j.Node
§ interface org.dom4j.Attribute
§ interface org.dom4j.Branch
§ interface org.dom4j.Document
§ interface org.dom4j.Element
§ interface org.dom4j.CharacterData
§ interface org.dom4j.CDATA
§ interface org.dom4j.Comment
§ interface org.dom4j.Text
§ interface org.dom4j.DocumentType
§ interface org.dom4j.Entity
§ interface org.dom4j.ProcessingInstruction
一目了然,很多事情都清楚了。大部分都是由Node继承来的。知道这些关系,将来写程序就不会出现ClassCastException了。
下面给出一些例子(部分摘自DOM4J自带的文档),简单说一下如何使用。
1. package com.nikee.dom4j;
2. import org.dom4j.Document;
3. import org.dom4j.DocumentHelper;
4. import org.dom4j.Element;
5. import org.dom4j.io.OutputFormat;
6. import org.dom4j.io.XMLWriter;
7. import java.io.*;
8.
9. public class XmlDom4J{
10. public void generateDocument(){
11. //使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类
12. Document document = DocumentHelper.createDocument();
13.
14. //使用 addElement()方法创建根元素catalog , addElement()用于向 XML 文档中增加元素
15. Element catalogElement = document.addElement( "catalog" );
16.
17. //在 catalog 元素中使用 addComment() 方法添加注释"An XML catalog"
18. catalogElement.addComment( "An XML Catalog" );
19.
20. //在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令
21. catalogElement.addProcessingInstruction( "target" , "text" );
22.
23. //在 catalog 元素中使用 addElement() 方法增加 journal 元素
24. Element journalElement = catalogElement.addElement( "journal" );
25. //使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性
26. journalElement.addAttribute( "title" , "XML Zone" );
27. journalElement.addAttribute( "publisher" , "IBM developerWorks" );
28.
29.
30. Element articleElement=journalElement.addElement( "article" );
31. articleElement.addAttribute( "level" , "Intermediate" );
32. articleElement.addAttribute( "date" , "December-2001" );
33.
34. Element titleElement=articleElement.addElement( "title" );
35. titleElement.setText( "Java configuration with XML Schema" );
36.
37. Element authorElement=articleElement.addElement( "author" );
38. Element firstNameElement=authorElement.addElement( "firstname" );
39. firstNameElement.setText( "Marcello" );
40. Element lastNameElement=authorElement.addElement( "lastname" );
41. lastNameElement.setText( "Vitaletti" );
42.
43. //可以使用 addDocType() 方法添加文档类型说明
44. //这样就向 XML 文档中增加文档类型说明:
45. document.addDocType( "catalog" , "nikee" , "file://c:/Dtds/catalog.dtd" );
46. try {
47. //XMLWriter output = new XMLWriter(new FileWriter( new File("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml")));
48. FileOutputStream fos= new FileOutputStream( "D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml" );
49. OutputFormat of= new OutputFormat( " " , true );
50. XMLWriter xw= new XMLWriter(fos, of);
51. xw.write( document );
52. xw.close();
53. }
54. catch (IOException e)
55. {
56. System.out.println(e.getMessage());
57. }
58. }
59.
60. public static void main(String[] argv){
61. XmlDom4J dom4j= new XmlDom4J();
62. dom4j.generateDocument();
63. }
64. }
xml 代码
1. <!--sp--> xml version = "1.0" encoding = "UTF-8" ?>
2. <!--CTYPE catalog PUBLIC "nikee" "file://c:/Dtds/catalog.dtd"</sp--> >
3.
4. < catalog >
5. <!--An XML Catalog--><!--sp--> target text ?>
6.
7. < journal title = "XML Zone" publisher = "IBM developerWorks" >
8. < article level = "Intermediate" date = "December-2001" >
9. < title > Java configuration with XML Schematitle >
10. < author >
11. < firstname > Marcellofirstname >
12. < lastname > Vitalettilastname >
13. author >
14. article >
15. journal >
16. catalog >
XmlDom4J.java 用于创建 XML 文档 catalog.xml
java 代码
java 代码
1. package com.nikee.dom4j;
2.
3. import org.dom4j.Document;
4. import org.dom4j.Element;
5. import org.dom4j.Attribute;
6. import java.util.List;
7. import java.util.Iterator;
8.
9. import org.dom4j.io.OutputFormat;
10. import org.dom4j.io.XMLWriter;
11. import java.io.*;
12.
13. import org.dom4j.DocumentException;
14. import org.dom4j.io.SAXReader;
15.
16. public class Dom4Jparser{
17. public Dom4Jparser(){
18. //construction
19. }
20.
21. public void modifyDocument(File inputXml){
22. try{
23. //使用 SAXReader 解析 XML 文档 catalog.xml
24. SAXReader saxReader = new SAXReader();
25. Document document = saxReader.read(inputXml);
26.
27. //使用 XPath 表达式从 article 元素中获得 level 节点列表。如果 level 属性值是"Intermediate"则改为"Introductory"
28. List list = document.selectNodes("//article/@level");
29. Iterator iter=list.iterator();
30. while(iter.hasNext()){
31. Attribute attribute=(Attribute)iter.next();
32. if(attribute.getValue().equals("Intermediate"))
33. attribute.setValue("Introductory");
34. }
35.
36. list = document.selectNodes("//article/@date" );
37. iter=list.iterator();
38. while(iter.hasNext()){
39. Attribute attribute=(Attribute)iter.next();
40. if(attribute.getValue().equals("December-2001"))
41. attribute.setValue("October-2002");
42. }
43.
44. //获取 article 元素列表,从 article 元素中的 title 元素得到一个迭代器,并修改 title 元素的文本
45. list = document.selectNodes("//article" );
46. iter=list.iterator();
47. while(iter.hasNext()){
48. Element element=(Element)iter.next();
49. Iterator iterator=element.elementIterator("title");
50. while(iterator.hasNext()){
51. Element titleElement=(Element)iterator.next();
52. if(titleElement.getText().equals("Java configuration with XML Schema"))
53. titleElement.setText("Create flexible and extensible XML schema");
54. }
55. }
56.
57.
58. list = document.selectNodes("//article/author" );
59. iter=list.iterator();
60. while(iter.hasNext()){
61. Element element=(Element)iter.next();
62. Iterator iterator=element.elementIterator("firstname");
63. while(iterator.hasNext()){
64. Element firstNameElement=(Element)iterator.next();
65. if(firstNameElement.getText().equals("Marcello"))
66. firstNameElement.setText("Ayesha");
67. }
68. }
69.
70. list = document.selectNodes("//article/author" );
71. iter=list.iterator();
72. while(iter.hasNext()){
73. Element element=(Element)iter.next();
74. Iterator iterator=element.elementIterator("lastname");
75. while(iterator.hasNext()){
76. Element lastNameElement=(Element)iterator.next();
77. if(lastNameElement.getText().equals("Vitaletti"))
78. lastNameElement.setText("Malik");
79. }
80. }
81.
82. FileOutputStream fos=new FileOutputStream("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog-modified.xml");
83. OutputFormat of=new OutputFormat(" ",true);
84. XMLWriter xw=new XMLWriter(fos, of);
85. xw.write( document );
86. xw.close();
87. }
88. catch(DocumentException e)
89. {
90. e.printStackTrace();
91. }
92. catch(IOException e){
93. e.printStackTrace();
94. }
95. }
96.
97. public static void main(String argv[]){
98. Dom4Jparser dom4jParser=new Dom4Jparser();
99. dom4jParser.modifyDocument(new File("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml"));
100. }
101. }
xml 代码
xml 代码
1. <!--sp--> xml version = "1.0" encoding = "UTF-8" ?>
2.
3. <!--<!DOCTYPE catalog PUBLIC "nikee" "file://c:/Dtds/catalog.dtd">-->
4. < catalog >
5. <!--An XML Catalog--><!--sp--> target text ?>
6. < journal title = "XML Zone" publisher = "IBM developerWorks" >
7. < article level = "Introductory" date = "October-2002" >
8. < title > Create flexible and extensible XML schematitle >
9. < author >
10. < firstname > Ayeshafirstname >
11. < lastname > Maliklastname >
12. author >
13. article >
14. journal >
15. catalog >
Dom4Jparser.java用于修改 XML 文档 catalog.xml为catalog-modified.xml
问题总结:
1.当catalog.xml有<!--CTYPE catalog PUBLIC"nikee" "file://c:/Dtds/catalog.dt-->这一句,Dom4Jparser.java修改 XML 文档 catalog.xml为catalog-modified.xml时,发生异常org.dom4j.DocumentException: c Nestedexception: c.
原因:我自己没有此 file://c:/Dtds/catalog.dtd .
解决办法:删掉此行.
2.除了加入dom4j.jar包外,必须加入jaxen.jar包,否则会发生异常.jaxen包可在 http://jaxen.org/ 下载.
3,针对dom4j的中文乱码问题。如果文件中有中文的话,那么设置xml文件编码为gbk,xml文件本身编码也为gbk。否则的话在ie中不能正常显示。
Document.setXMLEncoding();设置xml文件的编码。
Format.setEncoding();设置xml文件编码。
在读取xml文件的时候,应该设置SAXParser的编码和xml文件的编码一致。
- 用DOM4J解析XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 解析xml之--DOM4J
- dom4j解析XML
- 使用 dom4j 解析 XML
- xml文件解析-DOM4J
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- dom4j解析xml方法
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 使用 dom4j 解析 XML
- 关于Webpart自定义属性
- 美国兰德公司对中国人的评价 2008年06月04日 博客中国 作者:蒲勇健
- 这个世界很正常!
- 北京富通天地电脑有限公司电子商务成功案例
- Ubuntu 8.10解决安装部分软件过程中的出现方格的问题
- dom4j解析XML
- PPC2003SE 模拟器共享主机上网
- “您可能没有权限使用网络资源”解决方案
- My target in 2009!
- 关于引用了WebService的项目移植发布问题解决
- 感谢加洲宝贝,拯救了我男朋友的身体!
- 在Linux下进行C开发时要注意的事项
- 经济危机下,我找到走出困境的那道“暗门”
- Myeclipse 6.0.1下载,支持eclipse3.3.1