【问题标题】:script to extract the details from xml从 xml 中提取详细信息的脚本
【发布时间】:2011-08-24 04:18:42
【问题描述】:

如果有任何xml文件如下:

<soap env="abc" id="xyz">
<emp>acdf</emp>
<Workinstance name="ab" id="ab1">
<x>1</x>
<y>2</y>
</Workinstance>
<projectinstance name="cd" id="cd1">
<u>1</u>
<v>2</v>
</projectinstance>
</soap>

我想使用 unix 脚本提取 workinstance 中的 id 字段

我尝试了 grep,但它正在检索整个 xml 文件。 谁能帮我怎么弄?

【问题讨论】:

  • grep '&lt;Workinstance.*id=' file.xml 将过滤 id 字段
  • perl -nle 'print $1 if $_ =~ /workinstance.*?id=\"([^"]*)\"/i;' thexmlfile.xml 准确获取您想要的内容,但请改用 XML 解析器。
  • 我还是做不到。有人可以帮我吗?
  • 您可以针对任何使用困难的答案提出后续问题。

标签: unix shell


【解决方案1】:

您可能需要考虑类似XMLStarlet 的东西,它实现了 XPath/XQuery 规范。

即使在最好的条件下,使用正则表达式解析 XML 也基本上是不可能的,因此您越早放弃尝试使用 grep 执行此操作,您的情况就会越好。

【讨论】:

  • +1,在过去一年左右的时间里,XMLStarlet 已成为我不可或缺的工具。
【解决方案2】:

XmlStarlet 似乎是我正在寻找的工具!

要提取您的标签,请尝试执行以下操作:

cat your_file.xml | xmlstarlet sel -t -v 'soap/Workinstance/@id'

“soap/Workinstance/@id”是一个 XPath 表达式,它将获取 Workinstance 标记内的 id 属性。通过使用“-v”标志,您要求 xmlstarlet 将提取的文本打印到标准输出。

【讨论】:

    【解决方案3】:

    如果你有 Ruby

    $ ruby -ne 'print $_.gsub(/.*id=\"|\".*$/,"" ) if /<Workinstance/' file
    ab1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多