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 一个列表。
我正在尝试使用以下 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 一个列表。