哪一个是java中用于XML解析的最佳库[已关闭]

就目前情况而言,这个问题不适合我们的问答形式。我们希望答案能得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或广泛讨论。如果您觉得这个问题可以改进并可能重新打开,请访问帮助中心寻求指导。

9年前关闭的

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

在@Voo的回答之后,让我问另一个问题——我应该使用java的内置类还是任何第三方库,比如dom4j……有什么好处

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

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

公共静态void parse()抛出ParserConfiguration异常、IOException、SAXException{
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
工厂设置验证(true);
setIgnoringElementContentWhitespace(true);
DocumentBuilder=factory.newDocumentBuilder();
File File=新文件(“test.xml”);
文档doc=builder.parse(文件);
//对这里的文档做些什么。
}

SAX解析器:仅用于读取XML文档。SAX解析器遍历文档并调用用户的回调方法。有用于文档开始/结束、元素等的方法。它们在org.XML.SAX.ContentHandler中定义,并且有一个空的帮助器类DefaultHandler

公共静态void parse()抛出ParserConfiguration异常,SAXException{
SAXParserFactory=SAXParserFactory.newInstance();
工厂设置验证(true);
SAXParser SAXParser=factory.newSAXParser();
File File=新文件(“test.xml”);
saxParser.parse(文件,newelementhandler());//指定处理程序
}

StAx Reader/Writer:这与面向数据流的接口一起工作。程序在准备就绪时要求下一个元素,就像游标/迭代器一样。您也可以使用它创建文档。
阅读文件:

公共静态void parse()抛出XMLStreamException,IOException{
try(FileInputStream fis=newfileinputstream(“test.xml”)){
XMLInputFactory xmlInFact=XMLInputFactory.newInstance();
XMLStreamReader=xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()){
reader.next();//在此处执行操作
}
}
}

编写文档:

公共静态void parse()抛出XMLStreamException,IOException{
try(FileOutputStream fos=newfileoutputstream(“test.xml”)){
XMLOutputFactory xmlOutFact=XMLOutputFactory.newInstance();
XMLStreamWriter writer=xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
WriteStarteElement(“测试”);
//写东西
writer.writeedelement();
}
}

JAXB:读取XML文档的最新实现:是v2中Java 6的一部分。这允许我们从文档中序列化Java对象。您使用实现javax.XML.bind.Unmarshaller接口的类来读取文档(您可以从JAXBContext.newInstance中获得此类)。必须使用使用的类初始化上下文,但您只需指定根类,而不必担心静态引用类。
您可以使用注释来指定哪些类应该是元素(@XmlRootElement),哪些字段应该是元素(@XmlElement)或属性(@XmlAttribute,真令人惊讶!)

公共静态void parse()抛出JAXBEException、IOException{
try(FileInputStream adrFile=newfileinputstream(“测试”)){
JAXBContext ctx=JAXBContext.newInstance(RootElementClass.class);
解组器um=ctx.createUnmarshaller();
RootElementClass rootElement=(RootElementClass)um.unmarshal(adrFile);
}
}

编写文档:

公共静态void parse(RootElementClass out)抛出IOException、JAXBEException{
try(FileOutputStream adrFile=newfileoutputstream(“test.xml”)){
JAXBContext ctx=JAXBContext.newInstance(RootElementClass.class);
Marshaller ma=ctx.createMarshaller();
陆军元帅(外出,存档);
}
}

不知羞耻地从一些旧的演讲幻灯片上抄袭的例子;-)

编辑:关于“我应该使用哪个API?”。这要看情况而定-并非所有API都具有与您所看到的相同的功能,但是如果您能够控制用于映射XML文档的类,JAXB是我个人最喜欢的、非常优雅且简单的解决方案(尽管我没有将其用于非常大的文档,但它可能会变得有点复杂).SAX也很容易使用,如果你没有很好的理由使用它,就远离DOM——在我看来,旧的、笨重的API。我认为没有任何现代的第三方库具有STL中缺少的任何特别有用的功能,标准库通常具有经过非常良好测试的优势,记录在案且稳定

发表评论