在下面的XML中,使用perl或python(这是最快的),我想要一种方法来获取所有将attribute1设置为“ characters”且attribute2未设置为“ chr”或不具有attribute2本身的节点/节点名称。
请记住,我的xml可以有500个节点,所以建议您使用一种更快的方法来获取所有节点
<NODE attribute1="characters" attribute2="chr" name="node1">
<content>
value1
</content>
</NODE>
<NODE attribute1="camera" name="node2">
<content>
value2
</content>
</NODE>
<NODE attribute1="camera" attribute2="car" name="node3">
<content>
value2
</content>
</NODE>
最佳答案
您正在寻找的是xpath表达式:
//NODE[@attribute1="characters" and ( not(@attribute2) or @attribute2="chr")]
使用xmllint快速测试:
kent$ cat f.xml
<root>
<NODE attribute1="characters" attribute2="chr" name="node1">
<content>
value1
</content>
</NODE>
<NODE attribute1="camera" name="node2">
<content>
value2
</content>
</NODE>
<NODE attribute1="camera" attribute2="car" name="node3">
<content>
value2
</content>
</NODE>
</root>
kent$ xmllint --xpath '//NODE[@attribute1="characters" and ( not(@attribute2) or @attribute2="chr")]' f.xml
<NODE attribute1="characters" attribute2="chr" name="node1">
<content>
value1
</content>
</NODE>
更新
如果只想提取属性
name
的值,则可以使用以下xpath:// NODE [@ attribute1 =“ characters”和(不是(@ attribute2)或@ attribute2 =“ chr”)] / @ name
要么
字符串(// NODE [@ attribute1 =“ characters”和(不是(@ attribute2)或@ attribute2 =“ chr”)] / @ name)
仍然使用xmllint测试:
kent$ xmllint --xpath '//NODE[@attribute1="characters" and ( not(@attribute2) or @attribute2="chr")]/@name' f.xml
name="node1"
kent$ xmllint --xpath 'string(//NODE[@attribute1="characters" and ( not(@attribute2) or @attribute2="chr")]/@name)' f.xml
node1
关于python - 如何解析xml以获取具有特定属性值的特定节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28192769/