Dom4j 使用简介
- 格式:pdf
- 大小:220.00 KB
- 文档页数:36
dom4j element方法总结DOM4J是一个Java库,用于处理XML文档。
它提供了一种方便的方式来解析、修改和创建XML文档。
以下是DOM4J Element的一些常用方法:1. 获取子元素:`List<Element> elements()`: 获取当前元素的所有子元素。
`List<Element> elements(String name)`: 根据指定的元素名称获取所有子元素。
`Element element(String name)`: 根据指定的元素名称获取子元素对象,如果元素名称重复,则获取第一个元素。
2. 获取和设置文本内容:`String getText()`: 获取当前元素对象的文本内容。
`void setText(String text)`: 设置当前元素对象的文本内容。
3. 获取属性值:`String attributeValue(String name)`: 根据指定的属性名称获取其对应的值。
4. 添加属性:`public Element addAttribute(String name, String value)`: 根据指定的属性名称和值进行添加或修改。
5. 获取根元素:`Element getRootElement()`: 获取根元素对象(根标签)。
6. 遍历所有元素节点:可以通过递归的方式遍历所有元素节点并打印它们的名称。
首先获取根元素,然后对每个子元素递归调用此方法。
7. 其他常用操作:获取元素的命名空间URI、命名空间Prefix等。
判断元素是否有某个属性。
删除或替换子元素等。
使用DOM4J时,建议查阅官方文档或相关教程,以了解更多关于Element 和其它相关功能的详细信息。
1、DOM4J简介DOM4J是出品的一个开源XML 解析包。
DOM4J应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。
DOM4J 使用起来非常简单。
只要你了解基本的XML-DOM 模型,就能使用。
Dom:把整个文档作为一个对象。
DOM4J 最大的特色是使用大量的接口。
它的主要接口都在里面定义:接口之间的继承关系如下:interface interface interface interface interface interface interface interface interf ace interface interface interface interface 、X ML文档操作1、读取XML文档:读写XML文档主要依赖于包,有DOMReader和SAXReader两种方式。
因为利用了相同的接口,它们的调用方式是一样的。
public static Document load(String filename) {Document document = null;try {SAXReader saxReader = new SAXReader();document = (new File(filename)); 新增一个节点以及其下的子节点与数据Element menuElement = ("menu");Element engNameElement = ("engName");(catNameEn);Element chiNameElement = ("chiName");(catName);、写入XML文件注意文件操作的包装类是乱码的根源public static boolean doc2XmlFile(Document document, String filename) {boolean flag = true;try {XMLWriter writer = new XMLWriter( new OutputStreamWriter(new FileOutp utStream(filename),"UTF-8"));(document);();} catch (Exception ex) {flag = false;();}flag;}Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码方法。
如何⽤DOM4J解析XML认识XML XML是Extensible Markup Language 即可扩展标记语⾔的缩写,是⼀种简单的数据储存语⾔,使⽤⼀系列简单的标记来描述数据<element_name attribute_name="value" .../> // ⾃闭合<element_name attribute_name="value" ...> //对1-String2-<element_name attribute_name="value" .../>3-<element_name attribute_name="value" .../>...</element_name></element_name> 对XML的四种解析 ⽬前常⽤的XML解析技术有4种:(1)DOM DOM是基于XML的树结构来完成解析的,DOM解析XML的⽅式⾮常适⽤于多次访问XML的应⽤程序,但是其⽐较消耗资源;(2)SAX SAX是⼀种基于事件的解析,其主要是为了解决DOM解析的资源消耗问题⽽出现的,其优势是占⽤资源少,内存消耗⼩,⼀般在处理解析数据量⼤的XML⽂档才会使⽤(3)JDOM JDOM的⽬的是直接为JAVA编程服务,利⽤纯Java技术对XML⽂档实现解析⽣成,序列化以及其他操作;(4)DOM4J DOM4J具有性能优异、功能强⼤和易⽤的特点,同时它也是⼀个开放源代码的软件如何⽤DOM4J解析XML数据注:使⽤DOM4J解析XML,依赖于jar包 dom4j和jaxen 实现的步骤: 指定要解析的XML⽂件; 把XML⽂件转换成Document对象; 获取节点属性或⽂本的值。
File xml = new File("xmlfiles/xxx");SAXReader reader = new SAXReader();Document doc = reader.read(xml);//转换为⽂件Element root = doc.getRootElement();//获取节点属性List<Element> elements = root.elements(); //element 节点下⾯举⼀例分别分析xml⽂档 xml⽂档内容如下<?xml version="1.0" encoding="UTF-8"?><root><student id="1"><name>张飞</name><age>999</age><gender>男</gender></student><student id="2"><name>关⽻</name><age>888</age><gender>男</gender></student><student id="3"><name>刘备</name><age>777</age><gender>男</gender></student></root>若要读取XML⽂档中,可以直接⽤字符串输出的⽅式遍历,⾸先获取⼦元素,再遍历⼦元素⽂本//字符串输出for (Element element : elements) {String id = element.attributeValue("id");//获取当前指定⼦元素System.out.print(id+"\t");List<Element> subEs = element.elements();for (Element subE : subEs) {System.out.print(subE.getText()+"\t");//获取当前⼦元素⽂本}System.out.println("\n");}对于⼀个XML⽂档,我们也许需要检索所有的内容,但有时也可能需要检索某⼀固定节点或某⼀个属性,因此我们需要采取不同的检索⽅式 (1)当我们需要检索所有内容时,可以⽤动态数组的形式遍历出来即可; (2)当需要检索某⼀固定节点 Node node = document.selectSingleNode("//nodeName[@attrName = value]"); (3)检索某⼀属性(多节点检索) List<Element> = document.selecNodes("//nodeName[subEleName/text()='value']"); 取⼀分析结果,输出如下//检索固定节点Node node = doc.selectSingleNode("//student[@id=3]");//任意以student为根的节点if (null != node){Element element =(Element)node;String id = element.attributeValue("id");String name = element.elementText("name");String age = element.elementText("age");String gender = element.elementText("gender");Student student = new Student(Integer.parseInt(id),name,Integer.parseInt(age),gender);System.out.println(student);}当我们需要对XML⽂件进⾏改动时,有三种情况分别为新增、删除以及修改(变动过之后必须落盘) (1)新增 Element ele = root.addElement(...); Element subEle = ele.addElement(String nodeName); (2)删除 Element xxx = ... father.renmove(xxx); (3)修改 xxx.attribute(String attrName).setValue(String value); xxx.element(String subName).setText(String text); 下⾯例⼦为删除操作//删除//内存操作Node node = doc.selectSingleNode("//xxx[@id=3]");if (null != node){root.remove(node);//存盘OutputFormat format = OutputFormat.createPrettyPrint();XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("xmlfiles/kb.xml"),"UTF-8"),format);writer.write(doc);writer.flush();writer.close();}else {System.out.println("⽤户不存在");}。
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提供的方法,一种是通过字符串转换。
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与利⽤DOM、SAX、JAXP机制来解析xml相⽐,DOM4J 表现更优秀,具有性能优异、功能强⼤和极端易⽤使⽤的特点,只要懂得DOM基本概念,就可以通过dom4j的api⽂档来解析xml。
dom4j是⼀套开源的api。
实际项⽬中,往往选择dom4j来作为解析xml的利器。
针对于XML标准定义,对应于图2-1列出的内容,dom4j提供了以下实现:常⽤APIorg.dom4j.io.SAXReaderread 提供多种读取xml⽂件的⽅式,返回⼀个Domcument对象org.dom4j.Documentiterator 使⽤此法获取nodegetRootElement 获取根节点org.dom4j.NodegetName 获取node名字,例如获取根节点名称为bookstoregetNodeType 获取node类型常量值,例如获取到bookstore类型为1——ElementgetNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Elementorg.dom4j.Elementattributes 返回该元素的属性列表attributeValue 根据传⼊的属性名获取属性值elementIterator 返回包含⼦元素的迭代器elements 返回包含⼦元素的列表org.dom4j.AttributegetName 获取属性名getValue 获取属性值org.dom4j.TextgetText 获取Text节点值org.dom4j.CDATAgetText 获取CDATA Section值mentgetText 获取注释下⾯做了⼀个类以如下的XML为例:<html><head><title>解析xml例⼦</title><script><username>yangrong</username><password>123456</password></script></head><body><result>0</result><form><banlce>1000</banlce><subID>36242519880716</subID></form></body></html>import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.List;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .URL;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import com.alibaba.fastjson.JSON;public class OperateXml {@SuppressWarnings("unused")public static void main(String[] args) {// 下⾯是需要解析的xml字符串例⼦String xmlString = "<html><head><title>解析xml例⼦</title><script><username>yangrong</username><password>123456</password></script></head><body><result>0</result><form><banlce>1000</banlce><subID>36242519880716</ //主动创建document对象.Document document=DocumentHelper.createDocument();//建⽴document对象,⽤来操作xml⽂件Document testdoc=DocumentHelperreadStringXml(xmlString);//将⽂档或节点的XML转化为字符串.String docXmlText=testdoc.asXML();String teststring=Documentanalysis1(testdoc);System.out.print(teststring);}public static Document DocumentHelperreadStringXml(String xmlContent) {// DocumentHelper 解析xml字符串Document document = null;try {document = DocumentHelper.parseText(xmlContent);} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}return document;}public static Document SAXReaderreadStringXml(String xmlContent)throws DocumentException, UnsupportedEncodingException {/* SAXReader解析xml字符串 */Document document = null;try {// 读取输⼊流SAXReader saxReader = new SAXReader();document = saxReader.read(new ByteArrayInputStream(xmlContent.getBytes("utf-8")));// 字符串要根据相应的编码转成输⼊流才能被SAXReader读取。
Log4j配置第一步加入log4j-1.2.8.jar到lib下。
第二步在CLASSPATH下建立log4j.properties。
内容如下:1 log4j.rootCategory=INFO, stdout , R23 log4j.appender.stdout=org.apache.log4j.ConsoleAppender4 yout=org.apache.log4j.PatternLayout5 yout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n67 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender8 log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log9 yout=org.apache.log4j.Patter nLayout10 yout.ConversionPattern=%d-[TS] %p %t %c - %m%n1112 .neusoft=DEBUG13 .opensymphony.oscache=ERROR14 .sf.navigator=ERROR15 mons=ERROR16 .apache.struts=WARN17 .displaytag=ERROR18 .springframework=DEBUG19 .ibatis.db=WARN20 .apache.velocity=FATAL2122 .canoo.webtest=WARN2324 .hibernate.ps.PreparedStatementCache=WARN25 .hibernate=DEBUG26 .logicalcobwebs=WARN第三步相应的修改其中属性,修改之前就必须知道这些都是干什么的,在第二部分讲解。
第四步在要输出日志的类中加入相关语句:定义属性:static Logger logger = Logger.getLogger(LogDemo.class); //LogDemo为相关的类在相应的方法中:if (log.isDebugEnabled()){log.debug(“System …..”);}Log4j说明1 log4j.rootCategory=INFO, stdout , R此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。
本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。
可作为dom4j的入门资料。
1.下载与安装dom4j是上的一个开源项目,主要用于对XML的解析。
从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为dom4j-1.6.1。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。
可以到/projects/dom4j下载其最新版。
dom4j1.6解压后有一个dom4j-1.6.1.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-6.jarr文件,一般也需要引入,否则执行时可能抛ng. NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
2.示例XML文档(holen.xml)为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。
holen.xml<?xml version="1.0" encoding="UTF-8"?><books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[o wner]信息。
Dom4j 使用简介 作者:冰云 icecloud(AT)sina.com 时间:2003.12.15
版权声明: 本文由冰云完成,首发于CSDN,未经许可,不得使用于任何商业用途。 文中代码部分引用自DOM4J文档。 欢迎转载,但请保持文章及版权声明完整。 如需联络请发邮件:icecloud(AT)sina.com
DOM4J是dom4j.org出品的一个开源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),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法,如需深入的使用,请……自己摸索或查找别的资料。
之前看过IBM developer社区的文章(参见附录),提到一些XML解析包的性能比较,其中DOM4J的性能非常出色,在多项测试中名列前茅。(事实上DOM4J的官方文档中也引用了这个比较)所以这次的项目中我采用了DOM4J作为XML解析工具。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 在国内比较流行的是使用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 表达式
看名字大致就知道它们的涵义如何了。 要想弄懂这套接口,关键的是要明白接口的继承关系:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn o interface java.lang.Cloneable o o 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
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 一目了然,很多事情都清楚了。大部分都是由Node继承来的。知道这些关系,将来写程序就不会出现ClassCastException了。
下面给出一些例子(部分摘自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元素开始的。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
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) {
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 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(*)的空实现,以便简化代码。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn