我有一个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
示例2:如果在<a>
标签内有01
且<c>
标签有ProjectB
,则输出应为Second
我想尝试使用xml_grep或xpath,因为默认情况下这些是在linux中安装的软件包。我试过不同的方式,比如
xpath xtest.xml '//a[text()="01"]/text() | //b'
但这种验证不起作用。
例如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
。
以下命令使用XML作为file.xml
xpath file.xml '//demo[a/text()="00" and c/text()="ProjectA"]/b/text()'
强大的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