基于bash中的XML内容验证获取内容

时间:2018-03-02 08:46:09

标签: xml linux bash shell xml-parsing

我有一个XML如下

<demos>
 <demo>
  <a>00</a>
  <b>First</b>
  <c>ProjectA</c>
 </demo>
 <demo>
  <a>01</a>
  <b>Second</b>
  <c>ProjectB</c>
 </demo>
</demos>

示例1:如果<a>标记中00<c>标记包含ProjectA,则输出应为First < / p>

示例2:如果<a>标记中01<c>标记包含ProjectB输出应为Second < / p>

我想尝试使用xml_grep或xpath,因为默认情况下这些是在linux中安装的软件包。我试过了不同的方法,比如

xpath xtest.xml '//a[text()="01"]/text() | //b'

但是这个验证不起作用。

3 个答案:

答案 0 :(得分:1)

例如,您必须运行:

xpath -q -e '//demo[(a/text()="00") and (c/text()="ProjectA")]/b/text()' xtest.xml

例如2:

xpath -q -e '//demo[(a/text()="01") and (c/text()="ProjectB")]/b/text()' xtest.xml

请注意,在任何Linux上,默认情况下都不会安装xpath。在Ubuntu上,您首先必须运行sudo apt install libxml-xpath-perl

答案 1 :(得分:0)

以下命令使用XML作为file.xml

 xpath file.xml '//demo[a/text()="00" and c/text()="ProjectA"]/b/text()'

答案 2 :(得分:0)

强大的 xmlstarlet 解决方案:

xmlstarlet sel -t -m '//demo/a' --if '. = 00 and ./following-sibling::c="ProjectA"' \
-v './following-sibling::b' -n input.xml

输出:

First
xmlstarlet sel -t -m '//demo/a' --if '. = 01 and ./following-sibling::c="ProjectB"' \
-v './following-sibling::b' -n input.xml

输出:

Second