XML解析

来源:互联网 发布:sam smith 知乎 编辑:程序博客网 时间:2024/06/05 20:58

对于解析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.原生解析(先拿解析第二本书做事例)

@Testpublic 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  
原创粉丝点击