【问题标题】:Extract XML elements based on inner content根据内部内容提取 XML 元素
【发布时间】:2020-06-29 21:03:01
【问题描述】:

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

给定这样的结构:

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

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

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

我想在单独的文件中仅提取那些包含子字段 &lt;colour&gt; blue &lt;/colour&gt;person 元素。

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

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

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

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

提前致谢!

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

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

【问题讨论】:

  • 看看xidel。
  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • @JackFleeting 是基于流的?问题是,如果没有,程序会被自动终止。

标签: xml parsing sed grep


【解决方案1】:

由于到目前为止您尝试过的任何 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>

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

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 2020-07-20
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2012-01-10
    • 2012-03-13
    相关资源
    最近更新 更多