首页 > 解决方案 > 根据内部内容提取 XML 元素

问题描述

我有一个巨大的 XML 文档(超过 12 GB),需要按以下方式解析...

给定这样的结构:

<person name=Alice>
   <colour>blue</colour>
</person>

<person name=Bob>
   <colour>green</colour>
</person>

<person name=Charles>
   <colour>blue</colour>
</person>

我想在一个单独的文件中只提取那些person包含子字段的元素<colour> blue </colour>

例如,给定前面的 XML 代码,程序的输出应该是一个单独的文件,内容如下:

<person name=Alice>
   <colour>blue</colour>
</person>

<person name=Charles>
   <colour>blue</colour>
</person>

我尝试使用grepand sed,因为它们是非常有用的工具,并且可以管理像我这样的大文件,但我不太确定应该使用的正则表达式。

提前致谢!

编辑:正如我所指出的,我需要一个基于流的工具,否则程序就会崩溃!我试过xmlstarlet了,但程序是自动终止的(我想是由于内存使用)。

EDIT2:我也尝试使用 拆分文件xml_split,但生成的子文件数量根本无法处理。那么,有什么建议吗?

标签: xmlparsingsedgrep

解决方案


由于到目前为止您尝试过的任何 XML 感知工具都不适合您,并且如果您的输入像您发布的那样简单和常规:

$ awk -v RS= -v ORS='\n\n' '/<colour>blue</' file
<person name=Alice>
   <colour>blue</colour>
</person>

<person name=Charles>
   <colour>blue</colour>
</person>

如果这不是您所需要的,那么编辑您的问题以提供更具代表性的示例输入/输出。


推荐阅读