Python XML: 'TypeError: SubElement() argument 1 must be xml.etree.ElementTree.Element, not Element'

Python XML: 'TypeError: SubElement() argument 1 must be xml.etree.ElementTree.Element, not Element'

我有一个 xml 的另一部分的子元素列表,我想插入,如下所示:

import xml.etree.ElementTree as et
import xml

defs_element = xml.etree.ElementTree.Element('ns0:defs')
for pc_def in pc_defs_list:
    et.SubElement(defs_element, 'path', pc_def.attrib)

但是当我尝试时出现此错误:

TypeError: SubElement() argument 1 must be xml.etree.ElementTree.Element, not Element

其他方法会产生类似的 must be an Element, not Element 错误。如何获取这个不是元素的元素?

像这样的东西有效:

defs_xml_str = '<defs>'
for path_str in path_strs_list:
    defs_xml_str += path_str
defs_xml_str += '</defs>'
legend_1_xml.insert(0, et.fromstring(defs_xml_str))

有两个可能的问题:

  1. 如果删除命名空间 ns0: 前缀,问题是否会消失?在 ElementTree 中创建带命名空间的元素并不只是简单地加上前缀。查看 Emitting namespace specifications with ElementTree in Python 中的热门答案,了解命名空间的工作原理:
et.register_namespace('ns0',"http://ns0.namespaces.org")
defs_element = xml.etree.ElementTree.Element('{http://ns0.namespaces.org}:defs')
  1. 您没有解释 pc_defs_list 的来源。它可能加载到另一个文件中吗? C 版本的 ElementTree 对传入的确切 class 非常挑剔。因此,如果元素来自加载 ElementTree python 版本的文件,则无法将它们插入您的元素树。即使他们都在加载 ElementTree 的 C 版本(Python 3.3 之前的 cElementTree),如果他们不是从同一个二进制文件加载(例如,一个在虚拟环境中,一个在外部) ,然后出现此消息(以前是更神秘的 argument 1 must be Element, not Element 消息)。这似乎不太可能是这种情况,因为您正在创建一个新的 SubElement 而不是直接附加现有元素。

曾经在 Django 环境中,我什至遇到以下问题:

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element

root = Element('root')
hi = ET.Element('hi')
root.append(hi)

抱怨它们是不兼容的对象