xmllint 在单次执行中显示超过 1 个属性的值

xmllint 在单次执行中显示超过 1 个属性的值

我正在使用 xmllint 来解析具有多个标签的 xml 文件,每个标签都有多个属性。示例结构如下图:

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>

attr1我需要从属性、attr2和中获取值attr3

到目前为止,我已经尝试了以下方法,完美地给出了一个属性的数据

echo 'cat //root/child/@attr1' | xmllint --shell data.xml 

这个输出

attr1="abc"

所以,我的问题是,我们如何在字符串中指定多个属性以获得所需的输出:

attr1="abc"
attr2="def"
attr3="ghi"

我为此尝试了以下方法,但没有好的结果:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --shell data.xml 

上面的输出是 echo 语句再次重新回显,这意味着 xmllint 不接受它作为输入。

关于如何解决这个问题有什么想法吗?

答案1

据我所知,|分隔符只能在整个路径上使用:

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --shell data.xml

(作为//任何深度的意思,“//root”使解析器进行毫无意义的额外工作。假设您的示例 XML 看起来具有与真实 XML 类似的结构(因此 root 确实是 XML 的根节点),最好使用“/root/child” ”。)

或者您可以使用带有 XPath 函数的表达式:

echo 'cat /root/child/@*[name()="attr1" or name()="attr2" or name()="attr3"]' | xmllint --shell data.xml

如果您需要所有具有“attr*”名称的属性,您可以使用通用表达式:

echo 'cat /root/child/@*[starts-with(name(),"attr")]' | xmllint --shell data.xml

答案2

grep -o attr[0-9]...... file.ext

又快又脏……

相关内容