尝试用Python解析XML文件 - 我哪里做错了?
我第一次用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文件转换成对象或字典?我想获取所有的值,最好能附上名称。
4 个回答
你可能没有从DOM的角度考虑XML。简单来说,'C:/Something' 不是标签名为 'fileName' 的元素的节点值;它其实是标签名为 'fileName' 的元素的第一个子元素的文本节点的节点值。
我建议你在Python中多试试这个:先启动Python。
从xml.dom导入minidom
x = minidom.parseString('<Response><filename>C:/</filename>>')
x.getElementsByTagName('Response') ... x.getElementsByTagName('Response')[0].childNodes[0] ...
这样做下去,你会很快理解这个文档是如何被解析的。
如果你刚开始接触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、验证、xslt等等,你甚至可以切换到lxml,它实现了相同的API,但功能更多。)
这有帮助吗?
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/'}]