最近使用到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());
}
}