使用 Python 搜索我的 XML 的值

search in the values of my XML with Python

我有 XML 喜欢 this 并且我想获取带有 tag=035 和 code=a 的行的值,用于 tag=035 和 code=9 的节点是“白" 我试图用这个来识别 BAI 出现的节点,然后询问它的父节点

[ _sub.getparent() for _sub in _xml.findall(".//*[@tag='035']/*[@code='9']") if(_sub.text=='BAI') ]

但是父节点是空的...我如何在 035,9='BAI' 的节点处获取我的 035,a?

您可以像这样在纯 XPath 中完成所有操作:

//*[@tag='035']/*[@code='9'][. = 'BAI']/following-sibling::*[@code='a']

该公式假设任何验证 and/or 的数据都会强制执行任何 [@code='a']s 作为 following [@code='9']s.

您也可以,也许理想情况下,像这样编写 xpath:

//*[@tag='035']/*[@code='9'][. = 'BAI']/../*[@code='a']

或者像这样:

//*[@tag='035'][subfield[@code='9' and . = 'BAI']]/subfield[@code='a']

或更一般地说:

//*[@tag='035'][child::*[@code='9' and . = 'BAI']]/child::*[@code='a']

该公式在顺序方面没有任何假设。

XPath 是一种非常强大的语言,尤其是 XPath 3.0 是一种完全图灵完备的语言,这使它更加强大和令人敬畏。

就 lxml 而言,它不会采用所有这些公式。不过幸好接受了最短最甜的,所以:

from lxml import etree


tree = etree.parse("data/search.xml")

print(tree.findall("//*[@tag='035']/*[@code='9'][. = 'BAI']/../*[@code='a']"))

希望对您有所帮助!