用Python搜索我的XML的值

2024-05-16 20:38:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有类似于this的XML,我想获得tag=035和code=a的行的值,对于tag=035和code=9是“BAI”的节点 我试着找出BAI出现的节点,然后询问它的父节点

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

但是父级是空的。。。如何在035,9='BAI'节点获取035,a?你知道吗


Tags: textinforif节点tagcodexml
1条回答
网友
1楼 · 发布于 2024-05-16 20:38:57

您可以在纯XPath中这样做:

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

这个公式假定,任何验证和/或发布数据的东西都将强制执行任何[@code='a']作为之后的[@code='9']

您还可以(也许在理想情况下)这样编写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是一种非常强大的语言,尤其是XPath3.0,是一种完整的图灵完备语言,这使得它更加强大和令人敬畏。你知道吗

就lxml而言,它不需要所有这些配方。但幸运的是,最短最甜的被接受了,所以:

from lxml import etree


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

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

希望这有帮助!你知道吗

相关问题 更多 >