如何使用 XMLSTARLET 从大型 XML 文件中读取值?

如何使用 XMLSTARLET 从大型 XML 文件中读取值?

我有一个非常大的 XML 文件,我只需要从中读取值。到目前为止,我使用 XMLSTARLET 还没有成功。我使用“sel”,然后尝试提供项目的路径,但没有成功。我不知道要使用哪些额外的字符或字段。整个字符串?括号?还有一个名为“xml_grep”的工具,我假设我会使用带有类 unix 括号的路径来获取值。

有任何想法吗?

答案1

我假设您想要该 XML 文件中某些元素的值,并且您已经知道如何使用 Xpath 指定这些元素,例如//employee[@retired="no"]

然后获取该单个字段的值

xmlstarlet sel -t -v '//employee[@retired="no"]/name'  thefile.xml

或者,例如,当您想从每个员工中获取 2 个元素时,用竖线字符分隔:

xmlstarlet sel -t -m '//employee[@retired="no"]' -v name -o "|" -v "age" -nl file.xml

基本上,您指定一个模板(-t),然后是需要应用模板的位置(-m 后跟要匹配的 Xpath),然后是您想要从中提取的项目(-v 表示值)。

另一方面,程序“xml_grep”是 XML::Twig 的一部分。XML::Twig 的理念是它不会将整个 xml 读入内存,而是逐个处理文件。这导致您无法指定某些 Xpath(例如,引用同级元素的树枝)。当 XPath 足够简单,仅以逐个树枝为基础指定时,该程序确实允许处理非常大的文件,同时仅使用有限的内存。

您没有提供足够的有关 XML 文件结构或 XPath 类型的信息,而您希望其值能够在此处提供帮助。

当然,因为 XML 只是一种文本格式,所以根据文件的格式和问题的复杂性,甚至其他纯文本程序也可以工作:

grep -o '<name>[^<]*</name>' file.xml

相关内容