elementtree注册名称空间错误

pet*_*ter 7 python elementtree

我试着用这个注册名称空间:

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 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
Run Code Online (Sandbox Code Playgroud)

结果:(空)

2:

nsmap=root.nsmap
print nsmap
Run Code Online (Sandbox Code Playgroud)

结果: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
Run Code Online (Sandbox Code Playgroud)

结果:工作正常.

有没有机会一次注册名称空间?然后我想用listInvoice.find( 'INV:ID').文本而不是listInvoice.find( '.// {} http://www.stormware.cz/schema/version_2/invoice.xsd ID') .text(更好的代码,易于阅读)

Mar*_*ers 15

看起来文档尚未更新如何使用命名空间和.findall().

.findall()功能(以及.find(),.findtext() and.iterfind() ) takes a,其被认为是一个映射即找到代码时参考的唯一结构namespaces`论点:

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

.register_namespace()功能仅在将树再次序列化为文本时有用.

  • @Vincent:是的,属性访问不支持命名空间前缀转换,您需要传入完全限定的命名空间前缀。 (2认同)