我正在撰寫一個函式,使用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='require')
Itinerary = ET.SubElement(Header, 'Itinerary'/span>)
endpoint_uri = ET.SubElement(Itinerary, 'Endpoint'/span> uri='/blah/blah/common/xml'/span>)
header = ET.tostring(Message)
這就產生了下面的輸出(為了便于閱讀而進行了格式化):
<Message>
<Header>/span>
<Endpoint>/span>
<ID value="APP"/>
</Endpoint>/span>
<Context id="request"/>
<Itinerary>/span>
<Endpoint uri="/blah/blah/common/xml"/span>/>
</Itinerary>/span>
</標題>/span>
</Message>/span>
我試圖在 "訊息 "元素的上方插入以下XML:
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>/span>
<Endpoint>/span>
<ID value="APP"/>
</Endpoint>/span>
<Context id="request"/>
<Itinerary>/span>
<Endpoint uri="/blah/blah/common/xml"/span>/>
</Itinerary>/span>
</標題>/span>
<Body>/span>
<Account operation="query">
< ID ns="FOO" value="123456789"/>
</Account>/span>
</Body>/span>
</Message>/span>
我遇到的所有使用.insert()來做這件事的人都使用了一個檔案中的XML的例子,這是不可能的,因為XML檔案顯然是作為腳本的一部分被生成的。 該腳本失敗了
AttributeError: 'NoneType' object沒有屬性 'insert'。
而且試圖對頭檔案的值運行getroot()也失敗了,因為它期望的是一個文本檔案,而不是生成的XML。
uj5u.com熱心網友回復:
弄明白了:
import xml.etree.ElementTree as ET
輸入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='require')
Itinerary = ET.SubElement(Header, 'Itinerary'/span>)
endpoint_uri = ET.SubElement(Itinerary, 'Endpoint'/span> uri='/blah/blah/common/xml'/span>)
回傳訊息
header = xml()
Body = ET.Element('Body')
Account = ET.SubElement(Body, 'Account' , operation='query' )
id_value = ET.SubElement(Account, 'ID'/span>, ns='FOO'/span>, value='123456789'/span>)
header.insert(1, Body)
header = ET.tostring(header)
doc = xml.dom.minidom.parseString(header).toprettyxml(indent=" "/span>)
print(doc)
這就產生了:
<Message>
<Header>/span>
<Endpoint>/span>
<ID value="APP"/>
</Endpoint>/span>
<Context id="request"/>
<Itinerary>/span>
<Endpoint uri="/blah/blah/common/xml"/span>/>
</Itinerary>/span>
</標題>/span>
<Body>/span>
<Account operation="query">
< ID ns="FOO" value="123456789"/>
</Account>/span>
</Body>/span>
</Message>/span>
H/T to Jack Fleeting for the insert method catch.
uj5u.com熱心網友回復:
嘗試改變
header.insert(body,'Message' )
to
Message.insert(1,Body)。
并看看它是否有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/332443.html
標籤:
