【问题标题】:Search within xml file(s) in linux在 linux 中的 xml 文件中搜索
【发布时间】:2012-05-03 22:02:10
【问题描述】:

我有几个非常大 (10GB) 的 xml 文件,其结构如下。如您所见,该文件包含一系列记录。我想做的是基于一个或多个属性的搜索记录。问题是一个简单的 grep 会给我包含该属性的行。例如,grep 可能会给我第 100 行、第 300 行等等。但是,我需要的是提取相关记录元素的能力,而不仅仅是符合匹配项的行。是否有任何 unix 实用程序可以提供帮助?

<records>
 <record seq="1">
  <properties>
   <property name="AssetId">1234</property>
  </properties>
 <message>messsage1</message>
</record>
<record seq="2">
 <properties>
  <property name="VI-ID">4567</property>
 </properties>
 <message>message2</message>
</record>
<records>

【问题讨论】:

  • 这里给出了很多选项:stackoverflow.com/questions/91791/… 也可以看看 xmllint(libxml2 的一部分):xmlsoft.org/xmllint.html
  • 你想对提取的信息做什么?
  • 如果这个问题在前一个问题的基础上增加了一件事,那就是提供了示例输入文本——这样可以更容易地提供具体、可见的建议来展示建议工具的使用情况。
  • 将其保存为文件并转换为不同的格式

标签: xml linux


【解决方案1】:

xmlstarlet 允许您从 shell 脚本运行 XPath;这是一个完美的用例。

例如:

xmlstarlet sel -t \
  -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
  -c .

将打印 AssetId 属性为 1234 的整个记录​​。

如果您想在一次通过中进行多次匹配,也支持此操作:

xmlstarlet sel \
  -t -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
     -c . -n -n \
  -t -m '//record[properties/property/@name="VI-ID"]' \
     -c . -n -n \
  <input.xml

...此版本将打印 AssetID 为 1234 的记录,或带有任何值的 VI-ID 的任何记录,并在每个记录发出后放置两个换行符。

【讨论】:

    【解决方案2】:

    可能最简单的方法是对grep 使用-C 选项。它将在每个匹配项周围打印指定数量的行。是的,它不会完全停在记录边界上,但通常只要确保包含它就足以满足我的需求。

    【讨论】:

    • 当 OP 说“提取”时,我有一种感觉,他的意思是他实际上需要可用的数据,而不仅仅是行转储。
    【解决方案3】:

    如果您只想使用基本的 unix 工具,这里有一个(愚蠢的)小 sed 脚本,它可以提取出一个属性,该属性要么位于一行,要么跨越多行:

    sed -n '
    /<open>[^<]*<\/open>/ {
      p
      b
    }
    
    /<open>/,/<\/open>/ {
      p
    }' file.xml
    

    示例输入:

    <open>stuff</open>
    <otherTag>
    otherstuff
    </otherTag>
    <open>
    morestuff
    </open>
    <otherTag>astlkj</otherTag>
    

    示例输出:

    <open>stuff</open>
    <open>
    morestuff
    </open>
    

    不适合生产使用:如果一个标签有多个属性,这种方法很快就会变得困难、繁琐,而且如果 xml 足够复杂,那就不可能了。但它应该可以在这里和那里解析信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多