默认情况下,当您调用ElementTree.parse(someXMLfile)时,Python ElementTree库会为每个已解析的节点添加前缀,并在Clark的Notation中使用它的命名空间URI:
{http://example.org/namespace/spec}mynode
这使得在代码中稍后按名称访问特定节点非常痛苦.
我已经阅读了有关ElementTree和命名空间的文档,看起来该iterparse()函数应该允许我改变解析器前缀命名空间的方式,但对于我的生活,我实际上无法让它改变前缀.似乎在ns-start事件发生之前可能会在后台发生这种情况,如下例所示:
for event, elem in iterparse(source):
if event == "start-ns":
namespaces.append(elem)
elif event == "end-ns":
namespaces.pop()
else:
...
Run Code Online (Sandbox Code Playgroud)
如何更改前缀行为以及函数结束时返回的内容是什么?
我试着用这个注册名称空间:
ET.register_namespace("inv", "http://www.stormware.cz/schema/version_2/invoice.xsd")
Run Code Online (Sandbox Code Playgroud)
但它不起作用:
Traceback (most recent call last):
File "C:\tutorial\temp_xml2.py", line 34, in module>
for listInvoice in root.findall('inv:invoiceHeader'):
File "C:\Python27\LIB\xml\etree\ElementTree.py", line 390, in findall
return ElementPath.findall(self, path, namespaces)
File "C:\Python27\LIB\xml\etree\ElementPath.py", line 293, in findall
return list(iterfind(elem, path, namespaces))
File "C:\Python27\LIB\xml\etree\ElementPath.py", line 259, in iterfind
token = next()
File "C:\Python27\LIB\xml\etree\ElementPath.py", line 83, in xpath_tokenizer
raise SyntaxError("prefix %r not found in prefix map" % prefix)
SyntaxError: prefix 'inv' not found in prefix map
>>>
Run Code Online (Sandbox Code Playgroud)
这有什么问题?
谢谢Martinj
我试过 - 1:
for listInvoice …Run Code Online (Sandbox Code Playgroud)