尝试用Python解析XML文件 - 我哪里做错了?

0 投票
4 回答
1060 浏览
提问于 2025-04-16 03:20

我第一次用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 个回答

0

你可能没有从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] ...

这样做下去,你会很快理解这个文档是如何被解析的。

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,但功能更多。)

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/'}]

撰写回答