【问题标题】:Python LXML fails to find XML elementPython LXML 找不到 XML 元素
【发布时间】:2021-12-12 07:07:04
【问题描述】:

我正在尝试使用以下 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) 返回:

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

【问题讨论】:

  • 如果 md:EntityDescriptor 是根元素,尝试使用 find 查找子 md:EntityDescriptor 元素是行不通的。您已经将该元素选为root
  • @DanielHaley 果然,这就是问题所在。但是,问题是我需要对多个文件运行相同的操作,并且 md:EntityDescriptor 并不总是根元素。有没有办法找到一个元素,不管它是否是根?

标签: python xml lxml saml


【解决方案1】:

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

但是,问题是我需要对多个文件运行相同的操作,并且 md:EntityDescriptor 并不总是根元素。有没有办法找到一个元素,不管它是否是根?

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

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

注意xpath() 返回一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2021-05-08
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多