[英]Trying to parse an XML file with Python - what am I doing wrong?
我是第一次使用XML和Python。 最終目標是向REST服務發送請求,以XML接收響應,解析值並根據返回的內容發送電子郵件。 但是,REST服務尚未到位,因此目前我正在試驗保存在C驅動器中的XML文件。
我有一些簡單的代碼,但對為什么它不起作用感到困惑。
這是我的xml文件(“ XMLTest.xml”):
<Response>
<exitCode>1</exitCode>
<fileName>C:/Something/</fileName>
<errors>
<error>Error generating report</error>
</errors>
</Response>
到目前為止,這是我的代碼:
from xml.dom import minidom
something = open("C:/XMLTest.xml")
something = minidom.parse(something)
nodeList = []
for node in something.getElementsByTagName("Response"):
nodeList.extend(t.nodeValue for t in node.childNodes)
print nodeList
但是打印出來的結果是...
[u'\n\t', None, u'\n\t', None, u'\n\t', None, u'\n']
我究竟做錯了什么?
我正在嘗試獲取節點值。 有一個更好的方法嗎? Python中是否有內置方法將xml文件轉換為對象或字典? 我想獲取所有值,最好附上名稱。
這有幫助嗎?
doc = '''<Response>
<exitCode>1</exitCode>
<fileName>C:/Something/</fileName>
<errors>
<error>Error generating report</error>
</errors>
</Response>'''
from xml.dom import minidom
something = minidom.parseString( doc )
nodeList = [ ]
for node in something.getElementsByTagName( "Response" ):
response = { }
response[ "exit code" ] = node.getElementsByTagName( "exitCode" )[ 0 ].childNodes[ 0 ].nodeValue
response[ "file name" ] = node.getElementsByTagName( "fileName" )[ 0 ].childNodes[ 0 ].nodeValue
errors = node.getElementsByTagName( "errors" )[ 0 ].getElementsByTagName( "error" )
response[ "errors" ] = [ error.childNodes[ 0 ].nodeValue for error in errors ]
nodeList.append( response )
import pprint
pprint.pprint( nodeList )
產量
[{'errors': [u'Error generating report'],
'exit code': u'1',
'file name': u'C:/Something/'}]
如果您剛開始使用xml和python,並且沒有令人信服的理由使用DOM,則強烈建議您看看ElementTree api(在xml.etree.ElementTree的標准庫中實現 )
給你一個味道:
import xml.etree.cElementTree as etree
tree = etree.parse('C:/XMLTest.xml')
response = tree.getroot()
exitcode = response.find('exitCode').text
filename = response.find('fileName').text
errors = [i.text for i in response.find('errors')]
(如果您需要更多功能-xpath,validation,xslt等...-您甚至可以切換到lxml ,它實現了相同的API,但還有很多其他功能)
您不是從DOM的角度考慮XML。 也就是說,“ C:/ Something”不是其標記名是“ fileName”的元素的節點值; 它是文本節點的節點值,它是標記名是“ fileName”的元素的第一個子節點。
我建議您做的是在python本身中多玩一點:啟動python。
從xml.dom導入minidom
x = minidom.parseString('<響應> <文件名> C:/ </文件名>>')
x.getElementsByTagName('Response')... x.getElementsByTagName('Response')[0] .childNodes [0] ...
等等。 您將快速了解文檔的解析方式。
我推薦我的庫xml2obj 。 它比DOM更干凈。 “庫”只有84行代碼,您可以在任何地方嵌入。
In [185]: resp = xml2obj(something)
In [186]: resp.exitCode
Out[186]: u'1'
In [187]: resp.fileName
Out[187]: u'C:/Something/'
In [188]: len(resp.errors)
Out[188]: 1
In [189]: for node in resp.errors:
.....: print node.error
.....:
.....:
Error generating report
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.