java解析Xml

最近使用到xml,之前也没有研究过,记录一下。网上流传着4种解析xml的方式:dom、sax、jdom dom4j

直接复用他人的优缺点分析:

主要从工具性能、可用性等方面分析了在实际使用过程中的选择:

 1. DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,
    例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,
    那就采用DOM4J.

 2. JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出,但可移植。
    在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们
    期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。
    另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。
    它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐
    (与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它
    (如在JavaScript中使用DOM)。

 3. SAX表现较好,这要依赖于它特定的解析方式-事件驱动。
 一个SAX检测即将到来的XML流,但并没有载入到内存
 (当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
选择经验:

如果XML文档较大且不考虑移植性问题建议采用DOM4J;如果XML文档较小则建议采用JDOM;如果需要及时处理而不需要保存数据则考虑SAX。但无论如何,还是那句话:适合自己的才是最好的,如果时间允许,建议大家讲这四种方法都尝试一遍然后选择一种适合自己的即可。

原理理解

dom/jdom/dom4j api调用时就像在遍历一颗数一样,比较简单(简单广度搜索)
sax 是事件机制,写好事件很重要,复习DefaultHandler 的
开始元素:startElement(…)
结束元素:endElement(…)
元素内容:characters(…)

参考:程序媛想事儿(Alexia)
使用 SAX 处理 XML 文档
Java解析xml文件的方法

附属简单代码 sax与dom4j

code:

public static void main(String[] args) throws XMLStreamException, ParserConfigurationException, IOException, SAXException, DocumentException {
    InputStream in = XmlTest.class.getClass().getResourceAsStream("/test.xml");
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    parser.parse(in, new DefaultHandler(){

        private boolean end = false;

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if(StringUtils.equals(qName, "b")){
                end = true;
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            System.out.println(new String(ch, start, length));
        }
    });


    InputStream in2 = XmlTest.class.getClass().getResourceAsStream("/test.xml");
    SAXReader saxReader = new SAXReader();
    Document doc = saxReader.read(in2);
    Element root = doc.getRootElement();
    for(Iterator it = root.elementIterator(); it.hasNext();){
        Element el = (Element) it.next();
        System.out.println(el.getName());
        System.out.println(el.getText());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值