dom4j入门手册
- 格式:docx
- 大小:44.93 KB
- 文档页数:21
Dom4J对XML的创建、修改、删除等操作Dom4j也可以很⽅便完成XML⽂档的创建、元素的修改、⽂档的查询遍历等,但dom4j稍⽐jdom复杂⼀点,不过在⼤⽚⽂档的情况下dom4j 的性能要不jdom好。
# 准备⾸先,提供相关的jar包Dom4j jar包下载:jaxen jar下载:和dom4j依赖或相关的jar:Junit-jar下载:其次,准备测试案例的部分代码:package com.hoo.test;import java.io.File;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.QName;import org.dom4j.dom.DOMAttribute;import org.dom4j.io.SAXReader;import org.dom4j.tree.BaseElement;import org.junit.After;import org.junit.Before;import org.junit.Test;public class DocumentTest {private SAXReader reader = null;@Beforepublic void init() {reader = new SAXReader();}@Afterpublic void destory() {reader = null;System.gc();}public void fail(Object o) {if (o != null)System.out.println(o);}}# 创建⼀篇XML⽂档⽂档格式如下:<?xml version="1.0" encoding="UTF-8"?><catalog><!--An XML Catalog--><?target instruction?><journal title="XML Zone" publisher="IBM developerWorks"><article level="Intermediate" date="December-2001"><title>Java configuration with XML Schema</title><author><firstname>Marcello</firstname><lastname>Vitaletti</lastname></author></article></journal></catalog>@Testpublic void createDocument() {//创建⼀篇⽂档Document doc = DocumentHelper.createDocument();//添加⼀个元素Element root = doc.addElement("catalog");//为root元素添加注释root.addComment("An XML Catalog");//添加标记root.addProcessingInstruction("target", "instruction");//创建元素Element journalEl = new BaseElement("journal");//添加属性journalEl.addAttribute("title", "XML Zone");journalEl.addAttribute("publisher", "IBM developerWorks");root.add(journalEl);//添加元素Element articleEl = journalEl.addElement("article");articleEl.addAttribute("level", "Intermediate");articleEl.addAttribute("date", "December-2001");Element titleEl = articleEl.addElement("title");//设置⽂本内容titleEl.setText("Java configuration with XML Schema");//titleEl.addText("Java configuration with XML Schema");Element authorEl = articleEl.addElement("author");authorEl.addElement("firstname").setText("Marcello");authorEl.addElement("lastname").addText("Vitaletti");//可以使⽤ addDocType() ⽅法添加⽂档类型说明。
dom4j介绍dom4j的项目地址:/projects/dom4j/?source=directorydom4j是一个简单的开源库,用于处理XML、XPath和XSLT,它基于Java 平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP。
dom4j的使用下载了dom4j项目之后,解压缩,将其jar包(我的当前版本叫做dom4j-1.6.1.jar)加入class path下面。
(Properties->Java Build Path -> Add External JARs...)。
之后就可以使用其提供的API进行编程。
程序实例1第一个程序,用Java代码生成xml文档,代码如下:package com.example.xml.dom4j;import java.io.FileOutputStream;import java.io.FileWriter;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;/*** dom4j框架学习使用dom4j框架创建xml文档并输出保存**/public class Dom4JTest1{public static void main(String[] args) throws Exception{// 第一种方式:创建文档,并创建根元素// 创建文档:使用了一个Helper类Document document = DocumentHelper.createDocument();// 创建根节点并添加进文档Element root = DocumentHelper.createElement("student");document.setRootElement(root);// 第二种方式:创建文档并设置文档的根元素节点Element root2 = DocumentHelper.createElement("student");Document document2 = DocumentHelper.createDocument(root2);// 添加属性root2.addAttribute("name", "zhangsan");// 添加子节点:add之后就返回这个元素Element helloElement = root2.addElement("hello");Element worldElement = root2.addElement("world");helloElement.setText("hello Text");worldElement.setText("world text");// 输出// 输出到控制台XMLWriter xmlWriter = new XMLWriter();xmlWriter.write(document);// 输出到文件// 格式OutputFormat format = new OutputFormat(" ", true);// 设置缩进为4个空格,并且另起一行为trueXMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("student.xml"), format);xmlWriter2.write(document2);// 另一种输出方式,记得要调用flush()方法,否则输出的文件中显示空白XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("student2.xml"),format);xmlWriter3.write(document2);xmlWriter3.flush();// close()方法也可以}}程序Console输出:<?xml version="1.0" encoding="UTF-8"?><student/>生成的一个xml文档:<?xml version="1.0" encoding="UTF-8"?><student name="zhangsan"><hello>hello Text</hello><world>world text</world></student>程序实例2程序实例2,读入xml文档并分析,将其内容输出。
DOM4J介绍与代码示例2009-01-13 17:04:03标签:DOM4J原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
/113473/126310v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} st1\:*{behavior:url(#ieooui) }DOM4J是出品的一个开源XML解析包。
Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。
它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
DOM4J下载jar包:/dom4j/dom4j-1.6.1.jarJAXEN(对XPath的支持):/jaxen/distributions/jaxen-1.1.1.zip1.DOM4J主要接口DOM4J主要接口都在org.dom4j这个包里定义。
-Node为所有的dom4j中XML节点定义了多态行为;-Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为;|-Element 定义XML 元素;|-Document定义了XML文档;-DocumentType 定义XML DOCTYPE声明;-Entity定义 XML entity;-Attribute定义了XML的属性;-ProcessingInstruction 定义 XML 处理指令;-CharacterData是一个标识借口,标识基于字符的节点。
如CDATA,Comment, Text;|- CDATA 定义了XML CDATA 区域;|-Text 定义XML 文本节点;|- Comment 定义了XML注释的行为;2.创建XML文档下面是用dom4j创建上述文档,通过两种方式创建,一种是调用dom4j提供的方法,一种是通过字符串转换。
一、Loading XML Data以下代码从File 中或一个URL 中读取一个XML 文件,并产生一个Document 对象。
一个Document 对象表示了内存中的一棵XML 树,可以在这个XML 树中进行遍历、查询、修改等操作。
import java.io.*;import .*;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class XMLLoader {private Document doc = null;public void parseWithSAX(File file)throws MalformedURLException,DocumentException {SAXReader xmlReader = new SAXReader();this.doc = xmlReader.read(file);return;}public void parseWithSAX(URL url)throws MalformedURLException,DocumentException {SAXReader xmlReader = new SAXReader();this.doc = xmlReader.read(url);return;}}二、QName and NamespaceQName对象表示了一个XML元素或属性的qualified name,即一个namespace和一个local name的二元组。
Namespace对象表示了QName二元组中的namespace部分,它由prefix和URI两部分组成。
/******************** SAMPLE XML FILE ************************* <heavyz:Samplexmlns:heavyz="/schema/sample.xsd"><heavyz:HelloWorld/></heavyz:Sample>************************************************************* /public void printRootQNameInfo(Document doc) {Element root = doc.getRootElement();QName qname = root.getQName();System.out.println("local name : " + qname.getName()); System.out.println("namespace prefix: " +qname.getNamespacePrefix());System.out.println("namespace URI : " +qname.getNamespaceURI());System.out.println("qualified name : " +qname.getQualifiedName());return;}/************************* OUTPUT*****************************localname : Samplenamespace prefix: heavyznamespace URI :/schema/sample.xsdqualified name : heavyz:Sample************************************************************* /可以调用Namespace(String prefix, String uri)构造方法构造一个新的Namespace对象;也可以调用Namespace.get(String prefix, String uri)静态方法获得一个新的Namespace对象。
dom4j解析XML的基本用法dom4j解析XML的基本用法1. 需要的包:dom4j-1.4/dom4j.jar2. 用到的类:import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;3. 基本操作:创建文档:Document document = DocumentHelper.createDocument();创建根节点:Element catalogElement = document.addElement("catalog");添加注释: catalogElement.addComment("注释");处理指令:catalogElement.addProcessingInstruction("target","text");增加子节点:Element journalElement = catalogElement.addElement("journal");给节点添加属性:journalElement.addAttribute("title", "值");设置节点中的文本:journalElement.setText("值");添加文档类型:document.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd ");创建 xml 文件:XMLWriter output = new XMLWriter(new FileWriter( new File("c:/catalog/catalog.xml") ));output.write( document );output.close();加载 xml 文件:SAXReader saxReader = new SAXReader(); //SAXReader 包含在 org.dom4j.io 包中。
DOM4J详细教程
答:
DOM4J是一个Java XML API,它可以用来快速、高效地读取、生成和
修改XML数据。
它支持XPath的完整实现,支持Java5的新功能,并有一
个强大的可扩展的SAX集成,还支持JAXP 1.3、通过支持性能良好的DOM、SAX以及JAXP的结合,它可以提供XML文档的可用性。
1.使用DOM4J
使用DOM4J解析XML文档的主要步骤如下:
(1)创建一个Document对象,该文档对象将描述整个XML文档。
(2)创建一个XMLReader对象,该对象使用DOM4J的API来解析
XML文档。
(3)创建一个DocumentHandler对象,该对象用来处理XML文档内容,如处理XML文档的根元素和子元素等。
(4)使用XMLReader的parse方法来将Document对象与DocumentHandler对象相关联,以便允许访问Document对象的内容。
(5)执行任何必要的处理来解析XML文档中的元素。
2.DOM4J技术
(1)XML读取
DOM4J提供了一组API,可以在处理XML文档时使用。
DOM4J的
org.dom4j.io.XMLReader类可以解析XML文档,将其转换为DOM4J的
Document对象。
它可以使用InputSource或java.io.Reader对象的任何对象,以确保可以将XML文档从字符串、文件或URL读取。
(2)XML写入
(3)XPath查询。
你所应该知道的Dom4J创建解析器:SAXReader reader = new SAXReader();利用解析器读入xml文档:Document document = reader.read(new File("input.xml"));获取文档的根节点:Element root = document.getRootElement();接口继承结构:Node ---Branch--Document--Element----AttributeNode接口String asXML()asXMLreturns the textual XML representation of this node.将一个节点转换为字符串String getName()getNamereturns the name of this node.获取节点的名称,如果是元素则获取到元素名,如果是属性获取到属性名short getNodeType()Returns the code according to the type of node.获取节点类型,在Node接口上定义了一些静态short类型的常量用来表示各种类型Element getParent()getParentreturns the parent Element if this node supports the parent relationship or nullif it is the root element or does not support the parent relationship.获取父节点,如果是根元素调用则返回null,如果是其他元素调用则返回父元素,如果是属性调用则返回属性所依附的元素。
String getText()Returns the text of this node.返回节点文本,如果是元素则返回标签体,如果是属性则返回属性值List selectNodes(String xpathExpression)selectNodesevaluates an XPath expression and returns the result as a List of Nodeinstances or String instances depending on the XPath expression.利用xpath表达式,选择节点void setName(String name)Sets the text data of this node or this method will throw anUnsupportedOperationException if it is read-only.设置节点的名称,元素可以更改名称,属性则不可以,会抛出UnsupportedOperationException 异常void setText(String text)Sets the text data of this node or this method will throw anUnsupportedOperationException if it is read-only.设置节点内容,如果是元素则设置标签体,如果是属性则设置属性的值void write(Writer writer)writewrites this node as the default XML notation for this node.将节点写出到一个输出流中,元素、属性均支持Branch接口(实现了Node接口)void add(Element element)Adds the given Element to this branch.增加一个子节点Element addElement(QName qname)Adds a new Element node with the given QName to this branch and returns a reference tothe new node.增加一个给定名字的子节点,并且返回这个新创建的节点的引用int indexOf(Node node)Returns the index of the given node if it is a child node of this branch or -1 if the givennode is not a child node.获取给定节点在所有直接点中的位置号,如果该节点不是此分支的子节点,则返回-1boolean remove(Element element)Removes the given Element if the node is an immediate child of this branch.删除给定子元素,返回布尔值表明是否删除成功。
Dom4j 解析XML 使用方法
1、下载Dom4j
下载这个文件到官网找几乎不可能找到,不信可以试试。
大家可以到如下地址下载:/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
进入网址后可以看到网页有以上三个jar文件可以下载,当然你可以一个个下载,也可以点击这个链接(安装Ctrl键)Download dom4j-1.6.1.zip (11.7 MB) 进行下载。
2、配置
下载后我们可以得到dom4j-1.6.1.zip 的压缩文件。
在这一堆文件中把dom4j-1.6.1.jar解压下来。
接着把它加载到项目。
下面以eclipse为例
选择你要加载的项目,右击Build Path --- Configure~~~ 如图
在弹出的对话框中,点击Add External JARs~~~
按路径找到你刚才解压的文件点击打开,最后退出点击OK就行了。
3、使用
创建一个xml文件
新建class文件,文件名为:Dom4j.java 这个文件可以让我们创建一个基本的xml。
Dom4jTest.jav a
(红色方块点击可以获得源码)
读取xml文件
Dom4jTest2.jav a
更多内容可以发生邮件baaio@。
DOM4J实例教程DOM4J是一个Java 的XML API,用来读写XML文件十分的方便,如果大家对DOM4j 还是不太了解,可以看一下百度百科里的解释:/view/1460716.htm?fr=ala0_1_1当然也可以去官网了解一下:/,/第一个网址内容乱七八糟,所以就不要进去了,第二个网址还好一点,不过都是英文的。
其实,学习开源最好的方法就是去网上找一个实例,然后试着在自己的电脑上跑起来,之后再开始学习代码,当然,首先要下载工共:/projects/dom4j/files/这个网址就是上边的官网的下载地址。
下载的是这个文件:dom4j-1.6.1.zip下边就以一个实例来学习DOM4J,这个例子是我在网上找到的,感觉十分不错,我希望能一步步更细一点,因为当时拷过去的时候,花了好大功夫才运行正确的,原来还有些细节问题要处理,下边给出原文的链接:/blog/169842这个例子共写了五个操作XML的函数,第一个是创建XML文件,通过从根节点(Root)开始添加元素(Element)和属性(Attribute);第二个方法是修改XML文件,包括添加节点,修改节点,删除节点;第二个方法是格式化XML文件,包括格式化编码和输出;第四个方法是通过传递几个数组来批量添加XML的节点,并创建文件;第五个方法是获取XML的某些元素。
本实例基本涵盖了XML的基本操作,现在开始实例。
首先打开Eclipse创建一个新项目,然后将dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar(在/lib 文件夹下边可以找到)这两个jar包拷贝到项目文件夹下边,第一个是dom4j的Jar包,第二个是他所依赖的一个包,当然还有起来依赖的包,由于这个实例不需要就不拷了。
都可以在我们下载的工具文件夹中找到,选中两个Jar包,右键选择Build Path->Add to Build Path;新建一个类名称为getDoc.java,他的源码如下:packagecom.whuid.spider.rss.get;importjava.io.File;import java.io.*;importjava.util.*;importjava.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.dom4j.DocumentException;public class getDoc {publicgetDoc() {}/*** 建立一个XML文档,文档名由输入参数决定* @param filename 需建立的文件名* @return 返回操作结果, 0表失败, 1表成功*/publicintcreateXMLFile(String filename) {/** 返回操作结果, 0表失败, 1表成功*/intreturnValue = 0;/** 建立document对象*/Document document = DocumentHelper.createDocument();/** 建立XML文档的根dates */Element booksElement = document.addElement("dates");/** 加入一行注释*/booksElement.addComment("This is a test workDate,2010.07.29");/** 加入第一个workday节点*/Element bookElement = booksElement.addElement("workday");/** 加入day节点*/Element titleElement = bookElement.addElement("day");/** 设置属性*/titleElement.addAttribute("flag", "yes");/** 为title设置内容*/titleElement.setText("2004-11-16");/** 类似的完成后两个book */bookElement = booksElement.addElement("book");bookElement.addAttribute("show","yes");titleElement = bookElement.addElement("title");titleElement.setText("LuceneStuding");bookElement = booksElement.addElement("book");bookElement.addAttribute("show","no");titleElement = bookElement.addElement("title");titleElement.setText("Lucene in Action");/** 加入owner节点*/Element ownerElement = booksElement.addElement("owner"); ownerElement.setText("O'Reilly");Element ownerElement2 =booksElement.addElement("owner2"); ownerElement2.setText("1'Reilly");try {/** 将document中的内容写入文件中*/XMLWriter writer = new XMLWriter(new FileWriter(newFile(filename)));writer.write(document);writer.close();/** 执行成功,需返回1 */returnValue = 1;}catch (Exception ex) {ex.printStackTrace();}returnreturnValue;}/*** 修改XML文件中内容,并另存为一个新文件* 重点掌握dom4j中如何添加节点,修改节点,删除节点* @param filename 修改对象文件* @paramnewfilename修改后另存为该文件* @return 返回操作结果, 0表失败, 1表成功*/publicintModiXMLFile(String filename, String newfilename) { intreturnValue = 0;try {SAXReadersaxReader = new SAXReader();Document document = saxReader.read(new FileReader(new File(filename)));/** 修改内容之一: 如果book节点中show参数的内容为yes,则修改成no *//** 先用xpath查找对象*/List list = document.selectNodes("/dates/workday/day/@flag");Iterator iter = list.iterator();while (iter.hasNext()) {Attribute attribute = (Attribute)iter.next();if(attribute.getV alue().equals("yes")) {attribute.setValue("no");}}/*** 修改内容之二:* 并在book节点中加入price节点,price节点的内容为120,还为price节点添加一个参数"单位"*/list = document.selectNodes("/dates/book");iter = list.iterator();while (iter.hasNext()) {Element bookElement = (Element) iter.next();//ownerElement.setText("Tshinghua");Element priceElement = bookElement.addElement("price");priceElement.setText("120");priceElement.addAttribute("单位", "人民币");}/** 修改内容之三: 若day内容为2004-11-16,则将属性falg设为false */list = document.selectNodes("/dates/workday");iter = list.iterator();while (iter.hasNext()) {Element workdayElement = (Element) iter.next();Iterator iterator = workdayElement.elementIterator("day");while (iterator.hasNext()) {Element dayElement = (Element) iterator.next(); if (dayElement.getText().equals("2004-11-16")) {List list1 = dayElement.attributes();Iterator iter1 = list1.iterator();while (iter1.hasNext()) {Attribute attribute = (Attribute) iter1.next();attribute.setValue("false");}}}}try {/** 将document中的内容写入文件中*/XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));writer.write(document);writer.close();/** 执行成功,需返回1 */returnValue = 1;}catch (Exception ex) {ex.printStackTrace();}}catch (Exception ex) {ex.printStackTrace();}returnreturnValue;}/*** 格式化XML文档,并解决中文问题* @param filename* @return*/publicintformatXMLFile(String filename) {intreturnValue = 0;try {SAXReadersaxReader = new SAXReader();Document document = saxReader.read(new FileReader(new File(filename)));XMLWriter output = null;/** 格式化输出,类型IE浏览一样*/OutputFormat format = OutputFormat.createPrettyPrint();/** 指定XML字符集编码*/format.setEncoding("utf-8");output = new XMLWriter(new FileWriter(new File(filename)), format);output.write(document);output.close();/** 执行成功,需返回1 */returnValue = 1;}catch (Exception ex) {ex.printStackTrace();}returnreturnValue;}/*** create one XML of file* @param holiday String[]* @param workday String[]* @param filename String filename OF XML*/public void createXML(String[] holiday,String[] workday, String filename) {Document document = DocumentHelper.createDocument();Element booksElement = document.addElement("dates");for (int i = 0; i <holiday.length; i++) {Element bookElement = booksElement.addElement("holiday"); bookElement.addAttribute("flag", "yes");bookElement.setText(holiday[i]);}for (int i = 0; i <workday.length; i++) {Element bookElement = booksElement.addElement("holiday"); bookElement.addAttribute("flag", "no");bookElement.setText(workday[i]);}try {XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));writer.write(document);writer.close();}catch (Exception ex) {ex.printStackTrace();}}publicHashMapgetXMLElement(String filename) throws FileNotFoundException,DocumentException {HashMaphs=new HashMap();SAXReadersaxReader = new SAXReader();Document document = saxReader.read(new FileReader(new File(filename)));Element root=document.getRootElement();List list=root.elements("holiday");if(list.isEmpty()){return null;}else{Iterator it=list.iterator();while(it.hasNext()){Element holiday=(Element)it.next();hs.put(holiday.getTextTrim(),holiday.attribute("flag").getValue());}returnhs;}}public static void main(String[] args)throws FileNotFoundException,DocumentException {getDocgd=new getDoc();/*测试1*/int a=gd.createXMLFile("test.xml");System.out.println(a);/*测试2*///int b=gd.ModiXMLFile("test.xml", "newtest.xml");//System.out.println(b);/*测试3*///int c=gd.formatXMLFile("newtest.xml");//System.out.println(c);/*测试4*///String[] str1={"1","2","3","4"};//String[] str2={"a","b","c","d"};//gd.createXML(str1, str2, "create.xml");//gd.formatXMLFile("create.xml");/*测试5*///HashMap hash=new HashMap();//hash=gd.getXMLElement("create.xml");//String hashStr=hash.toString();//System.out.println(hashStr);}}上边的main方法是我写的测试的方法,请从测试1开始依次打开测试,生成的xml文档在后边是有用的,五个测试分别测试五个函数,第一个测试创建了一个test.xml的文件,第二个测试修改test.xml文件并保存为一个新的newtest.xml文件,第三个测试用来格式化newtest.xml文件,大家运行后就知道格式化的含义了,第四个测试是通过传递两个数组创建一个create.xml文件,第五个测试是从create.xml文件中取出一些属性给一个hashMap,然后输出这个hashmap。
Dom4j入门手册一.什么是dom4j?d om4j是一个Java的XML API,类似于jdom,用来读写XML文件的。
dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。
如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。
这是必须使用的jar包, Hibernate用它来读写配置文件。
DOM4J是出品的一个开源XML解析包,它的网站中这样定义:Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP.Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。
它应用于Java 平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
DOM4J使用起来非常简单。
只要你了解基本的XML-DOM模型,就能使用。
然而他自己带的指南只有短短一页(html),不过说的到挺全。
国内的中文资料很少。
二.Dom4j使用介绍1.下载与安装dom4j是上的一个开源项目,主要用于对XML的解析。
从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j 正迅速普及。
可以到/projects/dom4j下载其最新版。
dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛ng.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
2.dom4j主要接口Attribute定义了XML的属性Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,CDATA 定义了XML CDATA 区域CharacterData是一个标识借口,标识基于字符的节点。
如CDATA,Comment, Text.Comment 定义了XML注释的行为Document 定义了XML文档DocumentType 定义XML DOCTYPE声明Element定义XML 元素ElementHandler定义了 Element 对象的处理器ElementPath 被 ElementHandler 使用,用于取得当前正在处理的路径层次信息Entity定义 XML entityNode为所有的dom4j中XML节点定义了多态行为NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)ProcessingInstruction 定义 XML 处理指令.Text 定义XML 文本节点.Visitor 用于实现Visitor模式.XPath 在分析一个字符串后会提供一个XPath 表达式3.接口继承关系interface ng.Cloneableinterface org.dom4j.Nodeinterface org.dom4j.Attributeinterface org.dom4j.Branchinterface org.dom4j.Documentinterface org.dom4j.Elementinterface org.dom4j.CharacterDatainterface org.dom4j.CDATAinterface mentinterface org.dom4j.Textinterface org.dom4j.DocumentTypeinterface org.dom4j.Entityinterface org.dom4j.ProcessingInstruction三.Dom4j简单示例1读取并解析XML文档读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。
这就是依靠接口的好处。
// 从文件读取XML,输入文件名,返回XML文档Public Document read(String fileName) throws MalformedURLException, DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File(fileName));return document;}其中,reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。
得到的Document对象就代表了整个XML。
读取的字符编码是按照XML文件头定义的编码来转换。
如果遇到乱码问题,注意要把各处的编码名称保持一致即可。
2取得Root节点读取后的第二步,就是得到Root节点。
熟悉XML的人都知道,一切XML分析都是从Root元素开始的。
public Element getRootElement(Document doc){return doc.getRootElement();}3遍历XML树DOM4J提供至少3种遍历节点的方法:1) 枚举(Iterator)// 枚举所有子节点for ( Iterator i = root.elementIterator(); i.hasNext(); ) {Element element = (Element) i.next();// do something}// 枚举名称为foo的节点for ( Iterator i = root.elementIterator(foo); i.hasNext();) {Element foo = (Element) i.next();// do something}// 枚举属性for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {Attribute attribute = (Attribute) i.next();// do something}2)递归递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法public void treeWalk() {treeWalk(getRootElement());}public void treeWalk(Element element) {for (int i = 0, size = element.nodeCount(); i < size; i++) {Node node = element.node(i);if (node instanceof Element) {treeWalk((Element) node);} else { // do something....}}}3) Visitor模式DOM4J支持Visitor,这样可以大大缩减代码量,并且清楚易懂。
Visitor是GOF设计模式之一。
其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。
我们来看DOM4J中的Visitor模式,只需要自定一个类实现Visitor接口即可。
public class MyVisitor extends VisitorSupport {public void visit(Element element){System.out.println(element.getName());}public void visit(Attribute attr){System.out.println(attr.getName());}}调用:root.accept(new MyVisitor())Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。
上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。
VisitorSupport 是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。
注意,这个Visitor是自动遍历所有子节点的。
如果是root.accept(MyVisitor),将遍历子节点。
4 XPath支持DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择。
public void bar(Document document) {List list = document.selectNodes( //foo/bar );Node node = document.selectSingleNode(//foo/bar/author);String name = node.valueOf( @name );}例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现:public void findLinks(Document document) throws DocumentException {List list = document.selectNodes( //a/@href );for (Iterator iter = list.iterator(); iter.hasNext(); ) {Attribute attribute = (Attribute) iter.next();String url = attribute.getValue();}}5 字符串与XML的转换有时候经常要用到字符串转换为XML或反之,// XML转字符串Document document = ...;String text = document.asXML();// 字符串转XMLString text = <name>James</name> </person>;Document document = DocumentHelper.parseText(text);6 用XSLT转换XMLpublic Document styleDocument(Document document,String stylesheet) throws Exception {// load the transformer using JAXPTransformerFactory factory = TransformerFactory.newInstance();Transformer transformer = factory.newTransformer(new StreamSource( stylesheet ));// now lets style the given documentDocumentSource source = new DocumentSource( document );DocumentResult result = new DocumentResult();transformer.transform( source, result );// return the transformed documentDocument transformedDoc = result.getDocument();return transformedDoc;}7 创建XML一般创建XML是写文件前的工作,这就像StringBuffer一样容易。