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

Which is the best library for XML parsing in java

我正在搜索Java库解析XML(复杂的配置和数据文件),我Google有点,但找不到除了DOM4J(好像他们正在工作的V2)…我看过Commons配置,但不喜欢它,XML上的其他Apache项目似乎处于休眠状态。我还没有自己评估DOM4J,只是想知道JAVA有其他(好的)开源XML解析库吗?你对DOM4J的经验如何?

在@ Voo的回答让我问另一个-我应该使用Java的内置类或任何第三个库,如DOM4J…优势是什么?


实际上Java支持4种方法来解析XML:

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

1
2
3
4
5
6
7
8
9
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解析器:仅用于读取XML文档。SAX解析器通过文档运行并调用用户的回调方法。有一些方法可以用于文档、元素等的开始/结束。它们在org.xml.sax.contenthandler中定义,并且有一个空的helper类defaulthandler。

1
2
3
4
5
6
7
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读写器:这与面向数据流的接口一起工作。程序在准备就绪时请求下一个元素,就像光标/迭代器一样。您也可以用它创建文档。阅读文档:

1
2
3
4
5
6
7
8
9
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
        }
    }
}

编写文档:

1
2
3
4
5
6
7
8
9
10
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,真令人惊讶!)

1
2
3
4
5
6
7
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);
    }
}

编写文档:

1
2
3
4
5
6
7
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所缺少的任何特别有用的功能,而且标准库通常具有非常好的测试、文档记录和稳定的优势。


Java支持两种用于XML解析的方法。

萨克斯分析器

如果您想解析大型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/

多解析器

如果需要执行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/


尼基塔的观点很好:不要把成熟和坏混为一谈。XML变化不大。

JDOM将是DOM4J的另一个替代方案。


对于对使用JDOM感兴趣的人来说,但担心在一段时间内还没有更新(特别是不使用Java泛型),有一个称为COFCOOFM的分叉,它正好解决了这些方面并使JDOM API现代化,请在这里阅读更多内容:

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

从项目页面下载:

网址:https://github.com/cdmckay/coffeedom


如果您想要一个类似于dom的API——也就是说,XML解析器将文档转换为元素和属性节点树——那么至少有四种选择:dom本身、jdom、dom4j和xom。使用DOM的唯一可能原因是它被视为一个标准并在JDK中提供:在所有其他方面,其他方面都是优秀的。我自己的偏好是XOM,它结合了简单、强大和性能。

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


在Java中,不需要外部库来解析XML。Java已经有了SAX和DOM的内置实现。


vtd-xml是重型XML解析库…几乎在所有方面都比其他人好…这里是2013篇分析Java平台上所有XML处理框架的论文…

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