Python LXML 找不到 XML 元素

Python LXML fails to find XML element

我正在尝试使用以下 Python 代码查找名为“md:EntityDescriptor”的 XML 元素:

def parse(filepath):
    xmlfile = str(filepath)
    doc1 = ET.parse(xmlfile)
    root = doc1.getroot()
    test = root.find('md:EntityDescriptor', namespaces)
    print(test)

这是我的 XML 文档的开头,它是一个 SAML 断言。为了可读性和安全性,我省略了其余部分,但我正在搜索的元素确实在最开始:

<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor ...

我有一个命名空间定义“md”和其他几个:

namespaces = {'md': 'urn:oasis:names:tc:SAML:2.0:metadata'}

然而 print(test) 的输出是 None.

运行 ET.dump(root) 输出文件的全部内容,所以我知道我传递的输入没有问题。 运行 print(root.nsmap) returns:

{'md': 'urn:oasis:names:tc:SAML:2.0:metadata'}

如果 md:EntityDescriptor 是根元素,尝试使用 find 查找子 md:EntityDescriptor 元素是行不通的。您已经选择该元素作为根元素。

However, the problem is that I need to run this same operation on multiple files, and md:EntityDescriptor is not always the root element. Is there a way to find an element regardless of whether or not it's the root?

由于您使用的是 lxml,请尝试使用 xpath()descendant-or-self:: 轴而不是查找:

test = root.xpath('descendant-or-self::md:EntityDescriptor', namespaces=namespaces)

请注意 xpath() returns 一个列表。