相关疑难解决方法(0)

使用Python中的ElementTree更改名称空间前缀

默认情况下,当您调用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)

如何更改前缀行为以及函数结束时返回的内容是什么?

python xml namespaces elementtree

18
推荐指数
1
解决办法
9590
查看次数

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

python elementtree

7
推荐指数
1
解决办法
5230
查看次数

标签 统计

elementtree ×2

python ×2

namespaces ×1

xml ×1