4

我有一组工具可以索引大型 XML 文件(MediaWiki 转储文件)并使用这些索引来随机访问存储在文件中的各个记录。它工作得很好,但我正在用字符串函数和/或正则表达式“解析”XML,而不是真正的 XML 解析器,如果将来更改文件的创建方式,这是一个脆弱的解决方案。

一些或大多数 XML 解析器有办法做这些事情吗?

(我有用 C、Perl 和 Python 编写的工具版本。将整个文件解析到某种数据库或将它们映射到内存不是选项。)

更新

以下是粗略的统计数据: 我使用的文件大多是每周发布一次,当前文件的大小为 1,918,212,991 字节。我的索引工具的 C 版本在我的上网本上需要几分钟时间,并且对于每个发布的新 XML 文件只需运行一次。我很少在另一个 XML 文件上使用相同的工具,该文件的当前大小为 30,565,654,976 字节,并且在 2010 年仅更新了 8 次。

4

5 回答 5

1

我认为您应该将这些数据存储在 XML 数据库中,例如存在 DB,而不是创建自己的工具来完成 XML 数据库提供给您的一小部分功能。

于 2011-05-05T14:21:47.797 回答
1

如果您使用的是 Python,请尝试 lxml - 它非常快速且灵活,并且与正则表达式的速度相当。比任何语言的替代方案都要快得多 - 毫不妥协。

使用 iterparse 逐步浏览维基百科的文章。

请注意,这不会让您随机访问转储中的文章(这是一个完全合理的请求!) - 但 iterparse 将为您提供快速且易于使用的“只进”光标......而 lxml 可能是用于通过其他方式解析块 fseek'd 的正确工具。

这是我找到的最好的文档:

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(试试pdf版本)

它现在是标准 python 发行版的一部分。

于 2011-08-16T04:42:45.113 回答
1

VTD-XML看起来是解决这个问题的第一次认真尝试:

世界上内存效率最高的(XML 文档大小的 1.3x~1.5x)随机访问 XML 解析器

(VTD-XML 甚至在 StackOverflow 上都有自己的标签,因此您可以关注有关它的问题等:

于 2013-01-02T13:45:52.940 回答
0

XML 是一种结构化格式。因此,随机访问实际上并没有多大意义——你必须知道你要去哪里。

正则表达式还需要将整个字符串加载到内存中。这仍然比 DOM 好,因为 DOM 通常占用的内存是 XML 文件大小的 3-4 倍。

这些情况的典型解决方案是SAX,其中它们的内存占用量非常小,但它们就像只向前游标:因此您不是随机访问,您必须遍历树才能到达您需要的位置。如果您使用的是 .NET,则可以使用XmlTextReader.

如果 XML 不经常更新,索引也很有用,因为创建这样的索引可能很昂贵。

于 2011-05-05T12:51:46.983 回答
-1

XPath 比字符串/正则表达式“解析”要好得多,但是 xpath 可以先将 xml 文档解析到内存 DOM 中,如果您的文档非常大,您可能会遇到内存问题。

于 2011-05-05T12:52:46.037 回答