我有一个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'
但是这个验证不起作用。
答案 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