试图用Python解析XML文件 - 我做错了什么?

时间:2010-08-26 14:37:29

标签: 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 个答案:

答案 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