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());
    }
}
發佈了23 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章