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