使用 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']"))
希望对您有所帮助!
我有 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']"))
希望对您有所帮助!