簡體   English   中英

嘗試使用Python解析XML文件-我在做什么錯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM