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

mtk*_*mtk 5 command-line xml data xmllint

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

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>
Run Code Online (Sandbox Code Playgroud)

我需要从属性中获取值attr1,attr2attr3.

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

echo 'cat //root/child/@attr1' | xmllint --shell data.xml 
Run Code Online (Sandbox Code Playgroud)

这个输出

attr1="abc"
Run Code Online (Sandbox Code Playgroud)

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

attr1="abc"
attr2="def"
attr3="ghi"
Run Code Online (Sandbox Code Playgroud)

我为此尝试了以下方法,但效果不佳:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --shell data.xml 
Run Code Online (Sandbox Code Playgroud)

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

关于如何解决这个问题的任何想法?

man*_*ork 6

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

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --shell data.xml
Run Code Online (Sandbox Code Playgroud)

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

或者您可以将表达式与 XPath 函数一起使用:

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

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

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