Elementtree注册命名空间错误



我试图用这个注册命名空间:

ET.register_namespace("inv", "http://www.stormware.cz/schema/version_2/invoice.xsd")

但它不工作:

Traceback (most recent call last):
  File "C:tutorialtemp_xml2.py", line 34, in module>
    for listInvoice in root.findall('inv:invoiceHeader'):
  File "C:Python27LIBxmletreeElementTree.py", line 390, in findall
    return ElementPath.findall(self, path, namespaces)
  File "C:Python27LIBxmletreeElementPath.py", line 293, in findall
    return list(iterfind(elem, path, namespaces))
  File "C:Python27LIBxmletreeElementPath.py", line 259, in iterfind
    token = next()
  File "C:Python27LIBxmletreeElementPath.py", line 83, in xpath_tokenizer
    raise SyntaxError("prefix %r not found in prefix map" % prefix)
SyntaxError: prefix 'inv' not found in prefix map
>>>

这是怎么回事?


由于Martinj

I tried - 1.:

for listInvoice in root.findall('inv:invoiceHeader', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')):
    invoiceHeader = listInvoice.find('inv:id', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')).text
    print invoiceHeader

结果:(空的)

2。

nsmap=root.nsmap
print nsmap

结果:AttributeError: 'Element'对象没有属性'nsmap'

3。:

for listInvoice in root.findall('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}invoiceHeader'):
    invoiceHeader = listInvoice.find('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}id').text
    print invoiceHeader

结果:Works ok.

是否有机会立即注册名称空间?然后我想使用listInvoice.find('inv:id')。text代替listInvoice.find('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}id').text(更好的代码和易于阅读)

关于如何使用名称空间和.findall()的文档似乎还没有更新。

.findall()函数(以及.find(), .findtext() and .iterfind() ) takes a命名空间的参数,它应该是一个映射。这是查找标签时唯一参考的结构:

root.findall('inv:invoiceHeader', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd'))

.register_namespace()函数仅在将树再次序列化为文本时有用。

最新更新