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