如何向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
相关产品推荐
相关产品推荐

