我正在搜索用于解析XML(复杂配置和数据文件)的Java库,我在谷歌上搜了一下,但除了dom4j(似乎他们正在开发V2)之外没有找到其他内容。我看过commons-configuration,但不喜欢它,其他关于XML的Apache项目似乎都已经停滞不前了。我还没有自己评估过dom4j,只是想知道 - Java是否有其他(好的)开源XML解析库?你使用dom4j的体验如何?
在@Voo的回答后,让我再问一个问题 - 我应该使用Java的内置类还是像dom4j这样的第三方库..有什么优点?
我正在搜索用于解析XML(复杂配置和数据文件)的Java库,我在谷歌上搜了一下,但除了dom4j(似乎他们正在开发V2)之外没有找到其他内容。我看过commons-configuration,但不喜欢它,其他关于XML的Apache项目似乎都已经停滞不前了。我还没有自己评估过dom4j,只是想知道 - Java是否有其他(好的)开源XML解析库?你使用dom4j的体验如何?
在@Voo的回答后,让我再问一个问题 - 我应该使用Java的内置类还是像dom4j这样的第三方库..有什么优点?
实际上,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解析器:仅用于读取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文档:在Java 6中的v2版本中提供。这使我们能够从文档序列化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中缺失,标准库具有通常的优势,即经过极其充分的测试、文档化和稳定。
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/
在Java中,您不需要外部库来解析XML。自古以来,Java就带有内置的SAX和DOM实现。
如果你想使用JDOM,但担心它已经有一段时间没有更新(特别是没有利用Java泛型),那么有一个名为CoffeeDOM的分支正好解决了这些方面,并现代化了JDOM API,请在此处阅读更多信息:
http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/
并从项目页面下载:
VTD-XML是一款重型的XML解析库... 它在几乎所有方面都比其他库更好... 这里有一篇2013年的论文,分析了Java平台上所有可用的XML处理框架...
http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf