XML解析

1 篇文章 0 订阅
1 篇文章 0 订阅

对于解析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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值