我被如何使用文档化的sytnax:执行ElementTree命名空间字典以及随后的find((和findall((调用所困扰
<blockquote\搜索名称空间XML示例的更好方法是创建带有自己前缀的词典,并在搜索中使用这些前缀功能:
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>]