2015-05-18 24 views
9

我有一个XML文件的集合,其中一些非常大(最多约5000万个元素节点)。我正在使用xmllint验证这些文件,即使对于那些巨大的文件,它也能很好地工作,这要归功于流式API。如何在巨大的XML文件中执行命令行XPath查询?

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查询?

+0

尝试'--shell'选项交互(只用xml文件路径) – flafoux

+0

我试图打开交互shell的一个巨大的文件,但它会崩溃(“封杀”,就像在在不能使用'--stream'的情况下)才能输入任何命令。 – MRA

+0

http://superuser.com/questions/543881/efficiently-extracting-a-few-data-from-a-large-xml-file –

回答

3

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

从主页:

xmlcutty是从大的XML文件中雕刻出的元素,快一个简单的工具。由于它以流媒体的方式工作,它几乎不使用内存,并且每分钟可以处理大约1G的XML。

+1

像'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()” - 语法有点神秘。 – miku

-1

更改ulimits可能工作。试试这个:

$ ulimit -Sv 500000 
$ xmllint (...your command) 
相关问题