You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Python ElementTree生成的现有XML中插入子元素

问题解决方法

核心错误原因

  • 你写的xml()函数没有设置返回值,默认返回None,所以header = xml()拿到的是空对象,调用任何方法都会报AttributeError。
  • 你用ET.tostring()把XML节点对象转成了字符串/字节串,insert是ET.Element节点对象专属的方法,不能作用在字符串上。
  • insert方法的参数用法错误,正确语法为父元素对象.insert(插入位置索引, 待插入的子元素对象)。
  • 原有xml()函数里还有个隐蔽语法错误:创建Itinerary下的Endpoint节点时,标签名和属性之间漏了逗号。

修正后可运行代码

import xml.etree.ElementTree as ET

def generate_header():
    Message = ET.Element('Message')
    Header = ET.SubElement(Message, 'Header')
    Endpoint = ET.SubElement(Header, 'Endpoint')
    endpoint_id = ET.SubElement(Endpoint, 'ID', value='APP')
    Context = ET.SubElement(Header, 'Context', id='request')
    Itinerary = ET.SubElement(Header, 'Itinerary')
    # 补全漏写的逗号
    endpoint_uri = ET.SubElement(Itinerary, 'Endpoint', uri='/blah/blah/common/xml')
    # 直接返回根节点Element对象,不要转字符串
    return Message

# 拿到根节点对象
root = generate_header()

# 创建Body节点,全程用Element对象操作,不要提前转字符串
Body = ET.Element('Body')
Account = ET.SubElement(Body, 'Account', operation='query')
id_value = ET.SubElement(Account, 'ID', ns='FOO', value='123456789')

# Header是根节点的第0个子元素,所以Body插在索引1的位置,刚好在Header后面
root.insert(1, Body)

# 可选:Python 3.9+支持indent方法格式化输出XML
ET.indent(root, space=" ", level=0)
# 打印结果
print(ET.tostring(root, encoding='unicode'))

输出结果

运行上述代码就会得到你需要的XML结构:

<Message>
 <Header>
  <Endpoint>
   <ID value="APP" />
  </Endpoint>
  <Context id="request" />
  <Itinerary>
   <Endpoint uri="/blah/blah/common/xml" />
  </Itinerary>
 </Header>
 <Body>
  <Account operation="query">
   <ID ns="FOO" value="123456789" />
  </Account>
 </Body>
</Message>

内容的提问来源于stack exchange,提问作者drfunkenstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:57:04