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))
有两个可能的问题:
- 如果删除命名空间
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')
- 您没有解释
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)
抱怨它们是不兼容的对象
我有一个 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))
有两个可能的问题:
- 如果删除命名空间
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')
- 您没有解释
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)
抱怨它们是不兼容的对象