哪个是java中用于XML解析的最佳库

时间:2011-02-20 18:58:35

标签: java xml parsing

我正在搜索java库以解析XML(复杂的配置和数据文件),我搜索了一下但是找不到除了dom4j(看起来他们正在使用V2)..我已经看过公共配置但不喜欢它,其他关于XML的apache项目似乎处于休眠状态。我没有自己评估dom4j但只是想知道 - java有其他(好的)开源xml解析库吗?以及你对dom4j的体验如何?

在@Voo的回答之后让我问另一个 - 我应该在内置类或任何第三个库中使用java,比如dom4j ..有什么优势?

7 个答案:

答案 0 :(得分:195)

实际上,Java支持4种方法来解析开箱即用的XML:

DOM Parser / Builder:整个XML结构被加载到内存中,您可以使用众所周知的DOM方法来处理它。 DOM还允许您使用Xslt转换写入文档。 例如:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

SAX Parser:仅读取XML文档。 Sax解析器遍历文档并调用用户的回调方法。有文件的开始/结束方法,元素等。它们在org.xml.sax.ContentHandler中定义,并且有一个空的帮助器类DefaultHandler。

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

StAx Reader / Writer:这适用于面向数据流的接口。当程序就像光标/迭代器一样准备好时,程序会询问下一个元素。您也可以使用它创建文档。 阅读文件:

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

撰写文件:

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB:读取XML文档的最新实现:是v2中Java 6的一部分。这允许我们从文档中序列化java对象。您使用实现javax.xml.bind.Unmarshaller接口的类读取文档(您可以从JAXBContext.newInstance获取此类)。必须使用已使用的类初始化上下文,但您只需指定根类,而不必担心静态引用的类。 您可以使用注释来指定哪些类应该是元素(@XmlRootElement)以及哪些字段是元素(@XmlElement)或属性(@XmlAttribute,这真是一个惊喜!)

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

撰写文件:

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

从一些旧的演讲幻灯片中无耻地复制的例子; - )

编辑:关于“我应该使用哪种API?”。这取决于 - 并非所有的API都具有与您所看到的相同的功能,但是如果您可以控制用于映射XML文档的类,那么JAXB是我个人最喜欢的,非常优雅和简单的解决方案(尽管我没有使用它真的很大的文件,它可能会有点复杂)。 SAX也非常容易使用,如果您没有充分的理由使用它,请远离DOM - 我认为旧的,笨重的API。我认为没有任何现代的第三方库具有STL中缺少的任何特别有用的东西,标准库具有经过极好测试,记录和稳定的通常优势。

答案 1 :(得分:8)

Java支持两种开箱即用的XML解析方法。

SAXParser

如果要解析大型XML文件和/或不想使用大量内存,可以使用此解析器。

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

示例:http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

<强>的DOMParser

如果您需要执行XPath查询或需要提供完整的DOM,则可以使用此解析器。

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

示例:http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

答案 2 :(得分:4)

尼基塔的观点非常好:不要把成熟与坏混淆。 XML没有太大变化。

JDOM将成为DOM4J的另一种替代方案。

答案 3 :(得分:3)

您不需要外部库来解析Java中的XML。 Java已经为SAX和DOM提供了内置的实现。

答案 4 :(得分:3)

如果你想要一个类似DOM的API - 也就是说,XML解析器将文档转换为Element和Attribute节点的树 - 那么至少有四个可供选择:DOM本身,JDOM,DOM4J和XOM。使用DOM的唯一可能原因是它被认为是标准并且在JDK中提供:在所有其他方面,其他都是优越的。由于简单,强大和性能的结合,我自己的偏好是XOM。

当然,还有其他处理方式:低级解析器接口(SAX和StAX),数据对象绑定接口(JAXB)和高级声明性语言(XSLT,XQuery,XPath)。哪种方式最适合您,取决于您的项目要求和个人品味。

答案 5 :(得分:3)

对于有兴趣使用JDOM的人,但害怕暂时没有更新(特别是没有利用Java泛型),有一个名为CoffeeDOM的分支正好解决了这些方面并使JDOM API现代化,请在此处阅读更多内容:

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

并从项目页面下载:

https://github.com/cdmckay/coffeedom

答案 6 :(得分:1)

VTD-XML是重型XML解析库......它几乎在所有方面都优于其他...这是2013年的一篇论文,分析了java平台中可用的所有XML处理框架......

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf