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

Pre*_*raj 156 java xml parsing

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

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

Voo*_*Voo 210

实际上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.
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

写文件:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

写文件:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Kikiwa异常处理从这篇文章的角度尽可能多地删除.如果一些不称职的复制粘贴程序员继续前进并复制片段而不了解他们的目的,他们就会得到他们应得的.对他们并不十分担心或感兴趣.我要说的是删除try/catch块并显示方法签名而不是记录不同选项可以抛出的异常将节省空间,同时仍然保留有趣的信息.因此,如果有人想这样做,他们应该继续前进. (4认同)

小智 9

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/


Mic*_*Kay 7

如果您想要一个类似 DOM 的 API——也就是说,XML 解析器将文档转换成一个元素和属性节点树——那么至少有四种可供选择:DOM 本身、JDOM、DOM4J 和 XOM。使用 DOM 的唯一可能原因是因为它被视为一种标准并且在 JDK 中提供:在所有其他方面,其他方面都更胜一筹。我个人更喜欢 XOM,因为它结合了简单、强大和性能。

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

  • DOM 是 W3C 标准 (http://www.w3.org/DOM/)。该标准的 Java 实现包含在 JAXP 标准 (http://jcp.org/en/jsr/detail?id=206) 中。JAXP 然后由不同的提供者实现,例如:Oracle、Apache 等。 (2认同)