ElementTree命名空间字典无法使用find()或findall()



我被如何使用文档化的sytnax:执行ElementTree命名空间字典以及随后的find((和findall((调用所困扰

搜索名称空间XML示例的更好方法是创建带有自己前缀的词典,并在搜索中使用这些前缀功能:

<blockquote\
ns = {'real_person': 'http://people.example.com',
'role': 'http://characters.example.com'}
for actor in root.findall('real_person:actor', ns):
name = actor.find('real_person:name', ns)
print(name.text)
for char in actor.findall('role:character', ns):
print(' |-->', char.text)

>我遇到的问题是,如果我试图使用该文档中指出的语法;ns";dictionary作为find((或findall((中的第二个参数,我得到了一个空列表。如果我在不传递第二个参数的情况下键入完整的名称空间,它将返回所有期望的元素。

我已经这样定义了我的命名空间字典:

ns = {'ws':'{urn:com.workday/workersync}'}

这是ElementTree和根设置:

xmlparser = ET.parse(xmlfile)
xmlroot = xmlparser.getroot()

以下是我尝试使用文档中提到的词典快捷方式语法时得到的结果:

>>> xmlroot.findall('ws:Worker', ns)
[]

只是一个空列表。。。如果在调用中键入名称空间,我会得到以下结果:

xmlroot.findall('{urn:com.workday/workersync}Worker')
[<Element '{urn:com.workday/workersync}Worker' at 0x03220A78>, <Element'{urn:com.workday/workersync}Worker' at 0x0322D8C0>]

这将返回我的示例文件中预期的2个元素。

以下是我的示例文件的顶部,供参考:

<?xml version="1.0" encoding="UTF-8"?>
<ws:Worker_Sync xmlns:ws="urn:com.workday/workersync" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ws:Header>
<ws:Version>34.0</ws:Version>
<ws:Prior_Entry_Time>2020-07-04T21:40:25.822-07:00</ws:Prior_Entry_Time>
<ws:Current_Entry_Time>2020-07-04T22:03:47.458-07:00</ws:Current_Entry_Time>
<ws:Prior_Effective_Time>2020-07-04T00:00:00.000-07:00</ws:Prior_Effective_Time>
<ws:Current_Effective_Time>2020-07-05T00:00:00.000-07:00</ws:Current_Effective_Time>
<ws:Full_File>true</ws:Full_File>
<ws:Document_Retention_Policy>30</ws:Document_Retention_Policy>
<ws:Worker_Count>2</ws:Worker_Count>
</ws:Header>
<ws:Worker>
*<snipped rest of XML data>*

剪切后的XML数据包含2个<ws:Worker>元素,这些元素下有许多子子级。

我搞这件事的时间比我愿意承认的要长。我觉得我错过了一些非常明显的东西,在我看来,我的代码看起来就像我在网上找到的每个示例和文档上的示例代码。

请帮忙!

从URI字符串中删除花括号。名称空间字典应该如下所示:

ns = {'ws': 'urn:com.workday/workersync'}

另一个选项是为命名空间使用通配符。自Python 3.8:以来,find()findall()都支持此功能

print(xmlroot.findall('{*}Worker'))

输出:

[<Element '{urn:com.workday/workersync}Worker' at 0x033E6AC8>]

最新更新