向使用Python ElementTree生成的XML生成的现有XML插入子元素



我正在编写一个函数,使用ElementTree和Python 3.x为许多不同的请求生成xml头:

import xml.etree.ElementTree as ET
def xml():
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')
header = ET.tostring(Message)

生成以下输出(格式化以方便阅读):

<Message>
<Header>
<Endpoint>
<ID value="APP"/>
</Endpoint>
<Context id="request"/>
<Itinerary>
<Endpoint uri="/blah/blah/common/xml"/>
</Itinerary>
</Header>
</Message>

我正在尝试将以下XML插入到"Message"元素:

header = xml()
Body = ET.Element('Body')
Account = ET.SubElement(Body, 'Account', operation='query')
id_value = ET.SubElement(Account, 'ID', ns='FOO', value='123456789')
body = ET.tostring(Body)
header.insert(body,'Message')

所以它会像这样结束:

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

我所遇到的使用.insert()完成此操作的所有内容都使用了来自文件的XML示例,这将不起作用,因为XML文档显然是作为脚本的一部分生成的。脚本失败

AttributeError: 'NoneType' object has no attribute 'insert'

并且尝试在头值上运行geroot()失败,因为它期望一个文本文件,而不是生成XML。

figure out:

import xml.etree.ElementTree as ET
import xml.dom.minidom
def xml():
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')
return Message
header = xml()
Body = ET.Element('Body')
Account = ET.SubElement(Body, 'Account', operation='query')
id_value = ET.SubElement(Account, 'ID', ns='FOO', value='123456789')
header.insert(1,Body)
header = ET.tostring(header)
doc = xml.dom.minidom.parseString(header).toprettyxml(indent=" ")
print(doc)

生产:

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

H/T向杰克飞逝请求插入方法catch。

尝试更改

header.insert(body,'Message')

Message.insert(1,Body)

,看看它是否有效。

最新更新