为了账号安全,请及时绑定邮箱和手机立即绑定

Python XML: 'TypeError: SubElement() argument 1

Python XML: 'TypeError: SubElement() argument 1

LEATH 2022-08-16 18:49:49
我有一个来自xml另一部分的子元素列表,我试图插入,如下所示:import xml.etree.ElementTree as etimport xmldefs_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
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

有两个可能的问题:


如果删除命名空间前缀,问题是否会消失?在 ElementTree 中创建命名空间元素并不像只用前缀作为前缀那么简单。请参阅在 Python 中使用 ElementTree 发出命名空间规范中的主要答案,以显示命名空间的工作原理:ns0:

et.register_namespace('ns0',"http://ns0.namespaces.org")

defs_element = xml.etree.ElementTree.Element('{http://ns0.namespaces.org}:defs')

你没有解释从哪里来。它是否可能加载到另一个文件中?ElementTree在其C版本中对正在传入的确切类非常挑剔。因此,如果元素来自加载Python版本的ElementTree的文件,则无法将它们插入到ElementTree中。即使它们都加载了 ElementTree 的 C 版本(Python 3.3 之前的 cElementTree),如果它们不是从同一个二进制文件加载的(例如,一个在虚拟环境内部,一个在外部),那么会出现此消息(以前是更隐晦的消息)。这里的情况似乎不太可能,因为您正在创建新的子元素,而不是直接追加现有元素。pc_defs_listargument 1 must be Element, not Element

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


import xml.etree.ElementTree as ET

from xml.etree.ElementTree import Element


root = Element('root')

hi = ET.Element('hi')

root.append(hi)

抱怨它们是不兼容的对象


查看完整回答
反对 回复 2022-08-16
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

像这样的东西的工作原理:


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))


查看完整回答
反对 回复 2022-08-16
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信