这是用Java进行XML解析的最佳库。


158

我正在搜索Java库以解析XML(复杂的配置和数据文件),我用Google搜索了一下,但是除了dom4j之外都找不到(似乎它们正在V2上工作)。不喜欢它,其他有关XML的Apache项目似乎处于休眠状态。我还没有自己评估过dom4j,只是想知道-Java是否有其他(良好)开源xml解析库?您对dom4j的体验如何?

在@Voo回答之后,让我再问一个-我应该使用Java的内置类还是诸如dom4j之类的任何第三方库。优点是什么?


你能定义好吗?性能,API质量,还有其他?
Yishai

性能和易用性(是,API的质量)
Premraj 2011年

3
您尚未发布不使用Java本机实现的任何特定原因。
气垫船充满鳗鱼,

vtd-xml将成为性能/内存使用率和易用性方面的佼佼者。
vtd-xml-author

Answers:


213

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

DOM解析器/构建器:整个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读取器/写入器:与面向数据流的接口一起使用。程序会像游标/迭代器一样在准备就绪时询问下一个元素。您也可以使用它创建文档。阅读文件:

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所缺少的特别有用的功能,并且标准库具有通常的优点,即它们经过了严格的测试,记录和稳定。


@Natix这就是为什么要使用“编辑”选项的原因。现在应该更好。
奇奇瓦

4
@Kikiwa异常处理从本文的角度出发尽可能地多了。如果某些不称职的复制粘贴程序员继续前进,并且在不了解其目的的情况下复制了代码片段,那么他们将得到应有的收益。并不真正担心或感兴趣。我要说的是,删除try / catch块并显示方法签名来记录不同选项可能引发的异常,这将节省空间,同时仍保留有趣的信息。因此,如果有人想这样做,他们应该继续前进。
Voo

1
(同时,我将拒绝删除try / catch的编辑,而不用其他方式表示其他信息)
Voo

我相信JAXB不再包含在最新版本的JDK中。
Slaw

11

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/


5

如果要使用类似DOM的API(即一种XML解析器将文档转换为元素和属性节点的树的API),则至少有四个可供选择:DOM本身,JDOM,DOM4J和XOM。使用DOM的唯一可能原因是因为它被视为标准并且由JDK提供:在所有其他方面,其他所有方面都比较优越。XOM是我自己的首选,它结合了简单性,功能和性能。

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


2
DOM是W3C标准(w3.org/DOM)。JAXP标准(jcp.org/en/jsr/detail?id=206)涵盖了此标准的Java实现。然后,JAXP由不同的提供商实施,例如:Oracle,Apache等
。– bdoughan

实际上,如果不是(a)它被定义为标准并具有多种实现,并且(b)默认情况下包含在JDK中,则没有人会使用DOM。从所有其他角度来看,JDOM2和XOM是更可取的。
Michael Kay

4

Nikita的观点很出色:不要将成熟与坏相混淆。XML没有太大变化。

JDOM将是DOM4J的另一种选择。


您会选择哪一个?为什么?
2011年

1
这并不重要。两者都是JDK中内置的SAX和DOM解析器的包装。W3C文档层次结构冗长且难以使用,因此DOM4J和JDOM都试图使其变得更容易。我喜欢Elliott Rusty Harold,所以我倾向于先接触JDOM。
duffymo 2011年

4

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



1

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

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


3
警告:VTD-XML是根据GPL许可的,它可以在绝大多数专业或商业开发情况下有效地排除它。工程师应咨询自己的律师进行分析,但是,如果您有报酬从事工程师工作,则您很可能会发现您的组织不允许(也不能)使用GPL许可的任何库。
莎拉·G

该链接已失效
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.