dom4j
与JDOM一样,也是一种用于解析XML文档的开源库.dom4j是由早期开发JDOM的人分离出来的人独立开发的.
dom4j API使用了Java集合框架并完全支持DOM,SAX,JAXP
dom4j使用接口和抽象基类,dom4j的API相对复杂.
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:负责根据W3C的DOM树创建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接口下有两个子接口:Element和Document.
Element 代表XML元素
Document 代表XML文档
Attribute 代表XML元素属性
DocumentType 代表XML里的DOCTYPE.
ProcessingInstruction 代表XML文档里的处理指令.
CharacterData 所有文本元素的父接口,有CDATA ,Text,Comment三个子接口.
CDATA 代表XML里的CDATA段.
Text 代表XML里的文本内容
Comment 代表XML文档里的注释内容.
输出
DOMWriter:负责将dom4j树转换为W3C的DOM树.
SAXWriter:该输出工具类负责将dom4j树输出给SAX的ContentHandler处理.
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:负责根据W3C的DOM树创建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验证