我正在使用 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
又快又脏……