概念:dom4j是一个Java的XML API,是jdon升级版,用来读写XML文件
DOM4j是一个易用,开源的库,用于XML,Xpath,XSLT,
它应用于Java平台,采用Java集合框架并完全支持DOM,SAX和JAXP
DOM4j整合两种思想(SAX、DOM)
使用SAX的思想读取XML
使用DOM的思想,在内存中创建一颗对象关系树,可以参照之前学的DOM
解析XML文档,读写XML文档主要依赖于org.dom4j.io包,其中提供两个类:
1.DOMReader
2.SAXReader
这两个类的调用方式是一致的
public class ss {
//从文件读取XML,输入文件名,返回XML文档
public Document read(String fileName)throws MalformedURLException,DocumentException{
//创建SAX对象
SAXReader reader=new SAXReader();
Document document=reader.read(new File(fileName));
return document;
}
//其中reader的read方法时重载的,可以从InputStream,File,Url等多种不同的源来读取
//得到document对象就代表了整个XML
/*
* 注意:如果读取的字符编码是按照XML文件头定义的编码来转换,
* 如果出现乱码的问题,将各处的编码改成一致即可
* */
//获取root节点,读取后的第二步,得到Root节点
/*
* 注意:所有的XML分析都是从Root元素节点开始
*
*
* */
public Element getRootElement(Document doc){
return doc.getRootElement();
}
//遍历XML树
//DOM4j方式遍历节点
//枚举(iterator)
//枚举所有的子节点
for(Iterator i=root.elementIterator();
i.hasNext();
){
Element element= (Element) i.next();
//do something
}
//通过名称获取节点
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;i<element.nodeCount();i++){
Node node=element.node(i);
//判断元素是否包含
if(node instanceof Element){
treeWalk((Element) node);
}else{
//do something
}
}
}
//Visitor模式
/* Dom4j对Visitor的支持,可以大大减少代码量,并且层次清楚
是GOF设计模式中的一种,
原理:
两种类相互保有对方的引用,并且一种作为visitor去访问Visitor,只需要实现它的接口*/
}
public class ss extends VisitorSupport{
//Visitor模式
/* Dom4j对Visitor的支持,可以大大减少代码量,并且层次清楚
是GOF设计模式中的一种,
原理:
两种类相互保有对方的引用,并且一种作为visitor去访问Visitor,只需要实现它的接口*/
public void visit(Element element){
System.out.println(element.getName());
}
public void visit(Attribute attribute ){
System.out.println(attribute.getName());
}
//调用:root.accept(new MyVisitor())
/* Visitor接口提供多种重载,根据XML不同的对象,
将采用不同的方式去访问,上面给出的是Element,Attribute 的简单实现
注意:
1. VisitorSupport是Dom4j提供的默认的适配器,
Visitor接口的Default Adapter的模式,这个模式给出了各种visit(*)的空实现
2.这个visitor是自动遍历所有的子节点。
如果是root.accept(new MyVisitor()),将遍历子节点,
第一次使用时,需要自己遍历,一般在递归中使用
*/
/*
* 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文档中所有的超链接,
/*
* Xpath支持:
* 如访问一个节点,可以直接使用xpath选择
* */
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();
}
/*
* 字符串与XML的转换
* XML转换成字符串
* */
Document document1=...;
String text=document.asXML();
//将字符串转换成吗xml
String text1="<name>james</name>";
Document document2=DocumentHelper.parseText(text1);
}
//将XSL转换XML
public Document styleDocument(Document document,String stylesheet)throws Exception{
//加载transformer
TransformerFactory transformer=TransformerFactory.newInstance();
Transformer transformer1=transformer.newTransformer(new StreamSource(stylesheet));
DocumentSource documentSource=new DocumentSource(document);
DocumentResult result=new DocumentResult();
Document transformeDoc=result.getDocument();
return transformeDoc;
}
}
//创建XML:一般创建XML实在写文件之前,和StringBuffer一样
public Document createDocument()throws Exception{
Document document=DocumentHelper.createDocument();
Element root=document.addElement("root");
Element author=root.addElement("author").addAttribute(
"name","james").addAttribute("location","UK");
return document;
//文件的输出:将一个Document或者Node通过write方法输出
FileWriter out=new FileWriter("foo.xml");
document.write(out);
}
//如果你想要改变输出的格式,比如美化输出或者缩减格式,可以使用XMLWrite类实现
public void write(Document document)throws IOException{
//指定文件
XMLWriter writer=new XMLWriter(new FileWriter("abc.xml"));
writer.write(document);
writer.close();
//美化格式
OutputFormat format=OutputFormat.createPrettyPrint();
writer=new XMLWriter(System.out,format);
writer.write(document);
//缩减格式
format=OutputFormat.createCompactFormat();
writer=new XMLWriter(System.out,format);
writer.write(document);
}
使用Dom4j如何避免乱码?
写入的编码格式和读取的编码格式一致
1.如何控制写入的编码
XMLWriter writer1=new XMLWriter(
new PrintWriter("src/abc/bdc.xml","utf-8"),format);
2.如何控制读取编码的格式
<?xml version="1.0" encoding="GBK"?>
其中encoding决定读取编码的格式,
注意:encoding属性是由format.setEncoding("GBK")控制