test.xml
<?xml version="1.0" encoding="UTF-8"?>
<java_min>
<value>
<aa>000</aa>
<bb>111</bb>
<cc>222</cc>
</value>
<value>
<aa>333</aa>
<bb>444</bb>
<cc>555</cc>
</value>
<hello>
<aa>666</aa>
<bb>777</bb>
<cc>888</cc>
<dd>
<aa>01</aa>
<bb>02</bb>
<cc>03</cc>
</dd>
</holle>
</java_min>
1.读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。
//从文件读取XML,输入文件名,返回XML文档
public Document read(String fileName) throws MalformedURLException,DocumentException{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(fileName));
return doc;
}
其中,reader的read方法是重载的,可以从InputStream,File,Url等多种不同的数据源来读取文件。得到的Document对象就代表了整个XML。
根据个人经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。
2.取得Root节点
文件读取后的第二步,就是得到Root节点。熟悉XML的人都知道,一切XML分析都是从Root元素开始的。
public Element getRootElement(Document doc){
return doc.getRootElement(); //此方法得到的是根元素的根元素对象,使用getName()就可以得到根元素的名字java_min
}
3.遍历XML树
DOM4J提供至少3种遍历节点的方法:
(1)枚举(Iterator)
//枚举所有子节点
for(Iterator i = root.elementIterator(); i.hasNext();){ //从根元素中枚举出根元素下的多有一级元素即:value和hello元素
Element element = (Element)i.next();
//do something
}
sample:
File f =
new File("src/com/testXML/test.xml");
SAXReader reader =
new SAXReader();
Document doc = reader.read(f);
Element e = doc.getRootElement();
for(Iterator<?> i = e.elementIterator();i.hasNext();){ //每个i都是一个value对象
Element e1 = (Element)i.next();
for(Iterator<?> i1 = e1.elementIterator();i1.hasNext();){ //每个元素都是一个aa,bb,cc,dd对象
logger.info(((Element)i1.next()).getName()); //输出的是所有元素的名字,即:aa,bb,cc,dd 不是元素的值,元素的值要用 getText()方法得到
}
}
//枚举名称为hello的节点
for(Iterator i = root.elementIterator("hello");i.hasNext();){
Element e = (Element)i.next();
//do something
}
sample:
枚举dd元素底下的内容:
for
for(Iterator<?> i1 = e1.elementIterator("dd");i1.hasNext();){ //从hello元素中枚举出所有的dd元素
Element e2 = (Element)i1.next();
for(Iterator<?> i3 = e2.elementIterator();i3.hasNext();){ //从dd元素中枚举出所有的元素
logger.info(((Element)i3.next()).getText());
}
}
}
(Iterator<?> i = e.elementIterator("hello" );i.hasNext();){ //从根元素下枚举出所有的value和hello元素Element e1 = (Element)i.next();
//枚举属性
for(Iterator i = root.attributeIterator();i.hasNext();){
Attribute a = (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
}
}
}