dom4j

dom4j

JDOM一样,也是一种用于解析XML文档的开源库.dom4j是由早期开发JDOM的人分离出来的人独立开发的.

dom4j API使用了Java集合框架并完全支持DOM,SAX,JAXP

dom4j使用接口和抽象基类,dom4jAPI相对复杂.

 

dom4j使用SAX解析器来分析XML文档.创建dom4j.此外,dom4j也可以接收DOM格式的内容,并提供从dom4j树到SAX事件流或W3CDOM树的输出机制.

 

dom4j十分优秀,许多项目都用dom4j作为XML解析器.

 

面向接口编程

引用程序主要面向Document,Element,ProcessingInstruction等接口编程,至于这些接口的底层实现,程序员无须关心.

 

dom4j实质上是以其他XML解析器为基础的,采用面向接口编程的方式将允许dom4j的底层在不同的解析机制之间自由切换.

 

支持多种解析机制

dom4j对底层原始的XML解析器进行了高度封装,正是这种封装简化了XML处理.

org.dom4j.io包下提供了如下几个类.

DOMReader:负责根据W3CDOM树创建dom4j.

SAXReader:基于SAX解析机制来解析一份XML文档,并将其转换为dom4j.

XPP3Reader:其底层需要依赖XML Pull Parser 3.x .来解析XML文档,并将其转换为dom4j.

XPPReader:基于XML Pull Parser 2.x 解析器,目前不支持注释,CDATA和处理指令.

 

 

 

dom4j常用API

采用面向接口方式来解析XML文档,开发过程中所使用的API通常都是接口.

 

Node  dom4j树中的所有节点的根接口

Branch  代表能包含子节点的节点,Branch接口下有两个子接口:ElementDocument.

Element  代表XML元素

Document  代表XML文档

Attribute  代表XML元素属性

DocumentType  代表XML里的DOCTYPE.

ProcessingInstruction  代表XML文档里的处理指令.

CharacterData  所有文本元素的父接口,CDATA ,Text,Comment三个子接口.

CDATA  代表XML里的CDATA.

Text  代表XML里的文本内容

Comment  代表XML文档里的注释内容.

 

输出

DOMWriter:负责将dom4j树转换为W3CDOM.

SAXWriter:该输出工具类负责将dom4j树输出给SAXContentHandler处理.

XMLWriter:dom4j树转换成对应的XML文档,并可输出到指定输出流中.

 

创建新的Document

DocumentFactory:提供一个createDocument()方法用于创建Document对象.

DocumentHelper: 创建XML文档各个组成部分,该类的所有方法都是静态方法.

 

创建XML文档

org.dom包中提供了DocumentHelper.

Document doc=DocumentHelper.createDocument();

Element eltRoot=DocumentHelper.createElement(“student”);

doc.setRootElement(eltRoot);

也可以先创建根元素对象,然后创建文档对象的同时指定根元素.

Element eltRoot=DocumentHelper.createElement(“student”);

Document doc=DocumentHelper.createDocument(eltRoot);

 

添加属性

eltRoot.addAttribute(“sn”,”10”);

 

添加子元素以及设置元素内容

Branch接口中,定义了addElement()方法.

public Element addElement(String name)

 

该方法用指定的name为当前节点添加一个字元素节点,并返回新节点的引用.

:添加两个子元素.

Element eltName=eltRoot.addElement(“name”)  //创建元素,子元素.

Element eltAge=elt.addElement(“age”)  //创建元素,子元素.

 

eltName.setText(“剑圣”);  //给元素添加内容.

eltAge.setText(“128”);  //给元素添加内容.

 

输出文档

org.dom4j.io

DOMWrite类可以将dom4j树输出为W3C Document对象.

SAXWrite类可以将dom4j树作为SAX事件流输出.

XMLWrite类则提供了将dom4j树的各个部分以XML流的方式输出的能力.

 

将创建的XML文档输出到控制台:

XMLWriter xmlWriter=new XMLWriter();

xmlWriter.writer(doc);

将创建的XML文档输出到文件:

XMLWriter xmlWriter=new XMLWriter(new java.io.FileOutputStream(“student.xml”));

xmlWriter.writer(doc);

也可以使用java.io.Writer对象

XMLWriter xmlWriter=new XMLWriter(new java.io.FileWriter (“student.xml”));

xmlWriter.writer(doc);

xmlWriter.close();

 

注意如果不采用java.io.Writer 对象构建的XMLWriter对象,其底层代码设置了自动刷新,也就是说,对缓冲的输出,一旦调用了XMLWriter对象的writer()方法,将会自动刷新.

而对java.io.Writer对象构建XMLWriter对象,则没有设置自动刷新,所以在调用writer()方法后,需要调用xmlWriter.close(); 或者xmlWriter.flush();

注意XMLWriter继承自org.xml.sax.helpers.XMLFilterImpl,而不是从java.io.Writer类派生而来,它所提供的flush() close() 方法只是内部java.io.Writer对象的flush() close()方法的包装.

 

格式

控制文档输出格式的类

org.dom4j.io.OutputFormat  用于设置输出文档字符编码,设置行分隔符及控制使用的缩进字符串等.

 

:设置输出4个空格作为缩进字符串,元素之间添加新行

OutputFormat outFmt=new OutputFormat(“    ”,true);

XMLWriter xmlWriter=new XMLWriter(outFmt);

xmlWriter.writer(doc);

 

 

:美化的格式输出文档,设置GB2312,并用4个空格作为缩进.

OutputFormat outFmt=OutputFormat.createPrettyPrint();

outFmt.setEncoding(“GB2312”);

outFmt.setIndent (“    ”);

XMLWriter xmlWriter=new XMLWriter(outFmt);

xmlWriter.writer(doc);

 

 

构建dom4j

org.dom4j.io.

DOMReader:负责根据W3CDOM树创建dom4j.

SAXReader:基于SAX解析机制来解析一份XML文档,并从不同的输入源来构造dom4j.

SAXReader类来构造dom4j文档对象:

SAXReader saxReader=new SAXReader();

File file=new File(“student.xml”);

Document doc=saxReader.read(file);

 

DOMReader类来构造dom4j文档对象:

DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstanc(); 

DocumentBuilder db= dbf.new DocumentBuilder();

File file=new File(“student.xml”);

org.w3c.Document document=db.parse(file);

DOMReader domReader=new DOMReader();

org.dom4j.Document doc= domReader.read(document);   //W3C DOM document转成dom4j

 

访问根元素

Document,getRootElement()方法,用于返回文档下的根元素.

Element root=doc.getRootElement();

 

访问节点

要得到某个元素的所有子元素.

java.util.List childrenList=elt. elements();  //

 

要得到某个元素的指定名称的子元素

java.util.List childrenList= elt. elements(“student”);  //

 

要得到某个元素的指定名称的第一个子元素

Element eltChild= elt. element(“student”);  //

 

迭代所有子元素

for(java.util.Iterator it=root.elementIterator();it.hasNext();){

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

……

}

 

 

XPath

dom4j中集成了XPath的支持.选择节点时,可以直接使用XPath表达式.

为了能够编译执行XPath表达式.需要配置dom4j中自带的jaxen. jaxen包是一个用Java开发的开源XPath引擎,用于配置各种基于XML的对象模型,DOM,XOM,dom4j,JDOM.

 

:

得到student.xml中所有的<name>元素

java.util.List l= root. selectNodes(“//name”);  //

选择属性sn=01<student>元素

java.util.List l= root. selectNodes(“//student[@sn=’01’]”);  //

 

 

删除元素

要删除某个元素,使用Branch接口中定义的remove()方法.

Element eltStu=root.element(“student”);

root.remove (eltStu);  //

 

访问属性

要得到某个元素的所有属性

java.util.List attrList=elt. attributes();  //

要得到指定的属性

Attribute attr=elt. attribute(“sn”);  //

要得到指定的属性值

String attrValue=elt. attributeValue(“sn”);  //

要删除某个属性

elt. remove(elt. attributeValue(“sn”));  //

 

使用DTD验证

 

使用XML Schema验证

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值