我第一次使用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文件转换为对象或字典?我想得到所有的价值,最好是附上名字。
答案 0 :(得分:3)
这有帮助吗?
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/'}]
答案 1 :(得分:3)
如果您刚开始使用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,但有很多附加功能)
答案 2 :(得分:0)
从DOM的角度来看,您没有考虑XML。也就是说,'C:/ Something'不是标记名为'fileName'的元素的nodevalue;它是文本节点的nodevalue,它是标记名为'fileName'的元素的第一个子节点。
我建议你做的是在python本身中多玩一点:启动python。
来自xml.dom import minidom
x = minidom.parseString('&lt; Response&gt;&lt; filename&gt; C:/&lt; / filename&gt;&gt;')
x.getElementsByTagName( '响应') ... x.getElementsByTagName( '响应')[0] .childNodes [0] ...
等等。您将快速了解文档的解析方式。
答案 3 :(得分: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