对于解析XML解析,到现在为止有很多种,从早期的DOM解析 SAX解析 后来又出现了JAXP,JDOM,jsoup,dom4j。现在最流行的解析方式就会是dom4j。
简单说下这几种解析方式的优点跟缺点。(具体不讲,因为大部分已被淘汰)
DOM解析:
优点:因为此解析方式会将整个内容打包成DOM树加载到内存,所以结构明显,易于更改
缺点:因为他将所有的文件一次性加载到内存,所以很容易造成内存溢出
SAX解析:
优点:采用事件驱动解析,逐行加载,内存消耗少,适用于查找搜索
缺点:编码麻烦,因为逐行检索,检索到下一行,上一行就没了,所以很难同时访问多处不同 的数据,也不利于修改数据。
JDOM解析:
优点:
1、使用具体类而不是接口,简化了DOM的API。
2、大量使用了Java集合类,方便了Java开发人员。
缺点:
1、没有较好的灵活性。
2、性能较差。
JAXP解析跟dom4j解析:
特征:目前比较流行的解析方式,两种解析方式都实现了DOM+SAX的解析方式;
但DOM4J是目前性能最好,包括Sun的JAXM也在使用DOM4J。目前许多开源项目都大量用DOM4J。比如Hibernate。
解析代码
这里就讲解下DOM4J了,谁让他是现在最好的解析方式,同时也是用的最多的解析方式。
新建一个web工程,将DOM4J的jar包放到WebRoot/WEB-INF中,他会自动加载jar包。
然后在WebRoot路径下创建Book.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书 出版社="中国特大出版社">
<书名>魔兽世界编年史</书名>
<作者>BLZ</作者>
<单价>199</单价>
<批发价>200</批发价>
</书>
<书>
<书名>魔兽世界</书名>
<作者>blz</作者>
<单价>201</单价>
</书>
</书架>
新建测试类dom4jTest
1.原生解析(先拿解析第二本书做事例)
@Test
public void test01() throws Exception {
SAXReader reader = new SAXReader();// 创建一个xml解析对象
Document document = reader.read("WebRoot/Book.xml");// 把xml加载到Doucument中
Element root = document.getRootElement();//获得根目录节点
List<?> list = root.elements();//获得根目录节点下,所有元素(标签)
Element secondBook = (Element) list.get(1);//拿到第二本书的节点
Element bookNode = secondBook.element("书名");//获得书名节点
System.out.println(bookNode.getText());//获得内容
}
2.递归遍历所有内容
@Test
public void test02() throws Exception {
SAXReader reader = new SAXReader();// 创建一个xml解析对象
Document read = reader.read("WebRoot/Book.xml");// 把xml加载到Doucument中
Element root = read.getRootElement();//获得根目录节点
treeWalk(root);
}
private void treeWalk(Element root) {
System.out.print(root.getName()+" ");//打印根目录节点
for (int i = 0; i < root.nodeCount(); i++) {//小于根节点下所有节点总和
Node node = root.node(i);//获得第i节点下的节点
if (node instanceof Element) {//判断,如果此节点仍然为节点元素,那么继续判断。否则打印内容
treeWalk((Element) node);
}else {
System.out.print(node.getText()+" ");
}
}
}
最后解析出:
书架
书
书名 魔兽世界编年史
作者 BLZ
单价 199
批发价 200
书
书名 魔兽世界
作者 blz
单价 201