在下面的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/

10-14 06:14