【问题标题】:How to do command line XPath queries in huge XML files?如何在巨大的 XML 文件中进行命令行 XPath 查询?
【发布时间】:2015-05-18 14:21:05
【问题描述】:

我有一组 XML 文件,其中一些非常大(多达 5000 万个元素节点)。我正在使用 xmllint 来验证这些文件,这要归功于流 API,即使对于大型文件也能很好地工作。

xmllint --loaddtd --stream --valid /path/to/huge.xml

我最近了解到xmllint 也可以进行命令行 XPath 查询,非常方便。

xmllint --loaddtd --xpath '/root/a/b/c/text()' /path/to/small.xml

但是,这些 XPath 查询不适用于大型 XML 文件。一段时间后,我刚刚收到一条“Killed”消息。我尝试启用流 API,但这只会导致根本没有输出。

xmllint --loaddtd --stream --xpath '/root/a/b/c/text()' /path/to/huge.xml

在使用xmllint 进行 XPath 查询时,有没有办法启用流模式?是否有其他/更好的方法可以对大型 XML 文件进行命令行 XPath 查询?

【问题讨论】:

  • 尝试--shell 交互式选项(仅使用 xml 文件路径)
  • 我尝试为一个大文件打开交互式shell,但在我输入任何命令之前它会崩溃(“Killed”,就像不使用--stream的情况一样)。
  • 附加一个示例 XML 文件会有所帮助 - 我不知道 large 在您的情况下可能意味着什么。
  • 想想类似 dblp XML 转储 (dblp.dagstuhl.de/xml)。在非流式上下文中解析该文件时,我收到“Killed”错误。但我的问题本质上是针对任何足够大的文件,以至于不建议您在主内存中构建 DOM,而应该使用流式处理方法。

标签: xml xpath xmllint


【解决方案1】:

如果您的 XPath 表达式非常简单,请尝试 xmlcutty

来自主页:

xmlcutty 是一个简单的工具,可以快速从大型 XML 文件中提取元素。由于它以流方式工作,因此几乎不占用内存,每分钟可以处理大约 1G 的 XML。

【讨论】:

  • xmllint --loaddtd --xpath '/root/a/b/c/text()' /path/to/small.xml 这样的命令将被转换为xmlcutty -path '/root/a/b/c' -rename '\n' /path/to/small.xml - 其中 rename 旨在重命名最后一个封闭元素 - 从而模拟text() -语法有点神秘。
【解决方案2】:

更改ulimits 可能会起作用。试试这个:

$ ulimit -Sv 500000
$ xmllint (...your command)

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2013-10-22
    • 2021-10-28
    相关资源
    最近更新 更多