这两天光折腾xml的操作了。因为xml已知,所以觉得多套几个for就完了,可昨天晚上脑袋被套住出不来了。有时候实在没思路的时候,睡觉或许是个比较好的选择,今天一下茅塞顿开,还是写了个迭代,虽然现在仍然不能领会迭代的精髓,但还是想先和大家分享成果。代码如下:
依然用的是dom4j
XmlTree.java
package com.dianzi.test;
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class XmlTree {
/**
* @param args
*/
public static void main(String[] args) {
File file = new File("./src/com/dianzi/test/Log-Sample01.xml");
SAXReader saxReader = new SAXReader();
saxReader.setValidation(false);// 不验证xml文件内的dtd
try {
Document doc = saxReader.read(file);
System.out.println(doc);
XmlTree xml = new XmlTree();
xml.printXMLTree(doc);
} catch (Exception e) {
e.printStackTrace();
}
}
public void printXMLTree(Document doc) {
Element root = doc.getRootElement();
List arr = new ArrayList();
List result = printElement(root, 1, arr);// 根节点深度为1
return;
}
/**
* 遍历标签元素的迭代方法
*
* @param element
* 标签元素
* @param level
* 元素深度
* @param resultList
* 遍历的结果
* @return 返回resultList
*/
@SuppressWarnings("unchecked")
private List printElement(Element element, Integer level, List resultList) {
/**
* 每一个tempList包含四个元素
*
* @get(0):记录元素名称,即打印<A>B</A>的A
* @get(1):打印该标签的值,即打印<A>B</A>的B
* @get(2):元素深度
* @get(3):元素的属性及对应值列表,即<A c=“d” >B</A>=》attrObjList.get(0)存c
* =》attrObjList.get(1)存d
*/
List tempList = new ArrayList(4);
tempList.add(element.getQualifiedName());// 记录元素名称,即打印<A>B</A>的A
tempList.add(element.getText());// 打印该标签的值,即打印<A>B</A>的B
// 打印标签值不能放在下面的if中,可能第二层就有值,如<root><A>B</A></root>
tempList.add(level);// 元素深度;
Iterator eleAttriItor = element.attributeIterator();
if (eleAttriItor.hasNext()) {// 元素有参数的,遍历参数的个数
List attrObjList = new ArrayList(element.attributes().size());
while (eleAttriItor.hasNext()) {
Attribute eleAttr = (Attribute) eleAttriItor.next();
List attrObj = new ArrayList(2);
attrObj.add(eleAttr.getName());
attrObj.add(eleAttr.getValue());
attrObjList.add(attrObj);
}
tempList.add(attrObjList);
} else {
// 没参数的
}
resultList.add(tempList);
// 迭代
for (Iterator iter = element.elementIterator(); iter.hasNext();) {
Element sub = (Element) iter.next();
printElement(sub, level+1, resultList);//深度加一
}
return resultList;
}
}
Log-Sample01.xml
<?xml version="1.0" encoding="gb2312"?> <students> <student age="25" leader="学院领导"><!--如果没有age属性,默认的为20--> 男,1982年生,硕士,现就读于北京邮电大学 </student> <student> <name>cwb</name> <college leader="学院领导">PC学院</college><!--如果没有leader属性,默认的为leader--> <telephone>62358888</telephone> <notes>男,1987年生,硕士,现就读于中国农业大学</notes> </student> <student age="45"> <name>xxxxx</name> <college leader="">xxx学院</college> <telephone>66666666</telephone> <notes>注视中,注释中</notes> </student> <student age=""> <name>lxx</name> <college>yyyy学院</college> <telephone>88888888</telephone> <notes>注视中111,注释中222</notes> </student> </students>