在给定以下xml的情况下,如何使用查询元素树findall(‘Email’)?
Signer
joe@gmail.com
Joe Shmoe
1
2015-05-04T09:58:01.947
2015-05-04T09:58:14.403
2015-05-04T09:58:29.473
我觉得它与命名空间有关,但我不确定.我看了docs,没有运气.
tree =
root = tree.getroot()
root
root.findall('Email')
[]
解决方法:
您应该更仔细地阅读文档,特别是Parsing XML with Namespaces部分,其中包含一个几乎完全符合您要求的示例.
但即使没有文档,答案实际上也包含在您的示例输出中.当您打印文档的根元素时…
>>> tree = etree.parse(open('data.xml'))
>>> root = tree.getroot()
>>> root
…你可以看到它打印了带有名称空间前缀({http://www.docusign.net/API/3.0})的根元素名称(DocuSignEnvelopeInformation).您可以使用相同的前缀作为参数的一部分来查找:
>>> root.findall('{http://www.docusign.net/API/3.0}Email')
但这本身不起作用,因为这只会找到作为根元素的直接子元素的Email元素.您需要提供一个ElementPath表达式,以使findall执行整个文档的搜索.这有效:
>>> root.findall('.//{http://www.docusign.net/API/3.0}Email')
[]
您还可以使用XPath和名称空间前缀执行类似的搜索,如下所示:
>>> root.xpath('//docusign:Email',
... namespaces={'docusign': 'http://www.docusign.net/API/3.0'})
[]
这使您可以使用类似XML的名称空间:前缀而不是LXML名称空间语法.
标签:docusignapi,python,xml
来源: https://codeday.me/bug/20190929/1831893.html