使用xmllint根据另一个标签限定符的值提取标签内容

时间:2019-04-24 19:42:52

标签: xml xml-parsing xmllint

如果先前的标签上存在条件,我正在尝试使用xmllint从标签中提取数据。我知道可能有更好的工具,但仅限于xmllint和/或sed,awk等系统标准命令。

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<MainGroup>
<MainGroupEntry name="aaa" function="xxx">
    <EntryType type="AAA"/>
    <EntryDescription>Capture This A</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
<MainGroupEntry name="aaa" function="xxx">
    <EntryType type="AAA"/>
    <EntryDescription>Capture This A</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
<MainGroupEntry name="bbb" function="yyy">
    <EntryType type="BBB"/>
    <EntryDescription>Capture This B</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
<MainGroupEntry name="bbb" function="yyy">
    <EntryType type="BBB"/>
    <EntryDescription>Capture This B</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
</MainGroup>

我要尝试做的是;对于每个Entry type="AAA",请打印随附的EntryDescription。我尝试了xmllint --xpath '//MainGroupEntry/EntryType[@type="AAA"]/EntryDescription/text()' my_file.xml的不同变体,但是我总是得到一个空的XPath如果我放弃尝试获取“描述”文本,则可以看到符合“类型”条件的条目:

xmllint --xpath '//MainGroupEntry/EntryType[@type="AAA"]' my_file.xml <EntryType type="AAA"/><EntryType type="AAA"/>

我似乎无法弄清楚如何仅从“描述”字段中获取文本。有想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用following-sibling轴和text()函数从描述中仅提取文本:

xmllint --xpath '/MainGroup/MainGroupEntry/EntryType[@type="AAA"]/following-sibling::EntryDescription/text()' file.xml

要分隔文本,可以将--shell选项与cat一起使用:

echo 'cat /MainGroup/MainGroupEntry/EntryType[@type="AAA"]/following-sibling::EntryDescription/text()' \
| xmllint --shell file.xml

您可能需要| grep -v ' -----\|/ >'输出以删除分隔符并提示。