我有一个包含10万个片段的xml文件,每个片段中有6个字段。我想在不同时间在该xml中搜索不同的字符串。
java最好的xml阅读器是什么?
答案 0 :(得分:3)
好的,假设您有一百万个元素,每个元素大小为50个字符,比如50Mb的原始XML。在DOM中可能占用500Mb的内存,具有更紧凑的表示,例如Saxon的TinyTree,它可能是250Mb。按照今天的标准,这并不是一件大事。
如果您对同一文档进行了多次搜索,那么关键因素是搜索速度而不是解析速度。您不希望像某些人建议的那样进行SAX解析,因为这意味着每次进行搜索时都会解析文档。
我认为,下一个问题是你正在做什么样的搜索。您建议您基本上在内容中寻找字符串,但不清楚它们对结构的敏感程度。假设您正在使用XPath或XQuery进行搜索。我建议三种可能的实现方式:
a)使用内存中的XQuery处理器,如Saxon。将文档解析为Saxon的内部树表示,确保分配足够的内存。然后使用XQuery表达式随意搜索它。如果您使用Saxon的Home Edition,搜索通常是顺序搜索而不支持索引。
b)使用诸如MarkLogic或eXist之类的XML数据库。加载数据库的文档的初始处理将花费更长的时间,但它不会占用太多内存,并且您可以通过定义索引来更快地进行查询。
c)考虑使用Lux(http://luxdb.org)这是一种混合体:它在Lucene之上使用Saxon XQuery处理器,这是一个自由文本数据库。它似乎专门针对您描述的场景而设计。我自己没有用过。答案 1 :(得分:1)
如果您也可以分享您的xml格式,那就太棒了。 IMO JAXB应该很好。
答案 2 :(得分:1)
您是将XML文档加载到内存中一次然后多次搜索?在这种情况下,解析的速度不是关注,而是搜索的速度。但是如果你为每次搜索解析一次文档,那么你需要快速解析它。其他因素包括搜索的性质以及您希望呈现结果的方式。
你问问题正文中的“最佳”xml阅读器是什么,但在标题中你要求“最快”。最好的选择并不总是最快的。因为解析是一种成熟的技术,不同的解析方法可能只有几微秒的性能差异。您是否准备好进行四倍的开发工作以换取性能提升5%?
答案 3 :(得分:0)
处理非常大的XML文件的解决方案是使用SAX解析器。使用DOM解析,任何库都会因非常大的XML文件而失败。嗯,失败是相对于你拥有的内存量以及DOM解析器的效率。
但无论如何,处理大型XML文件需要SAX解析器。将SAX视为仅将元素抛出XML文件的东西。它是一个基于偶数的顺序解析器。甚至是因为你被抛出了诸如start元素,end元素之类的元素。你必须知道你有兴趣获得哪个元素并正确处理它们。
我建议你玩这个简单的例子来理解SAX, http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/