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
,attr2
和attr3
.
到目前为止,我已经尝试了以下方法,它完美地给出了一个属性的数据
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 不接受它作为输入。
关于如何解决这个问题的任何想法?
据我所知,|
分隔符只能用于整个路径:
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)