代码之家  ›  专栏  ›  技术社区  ›  froadie

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

  •  0
  • froadie  · 技术社区  · 16 年前

    我有一个简单的代码,我不明白为什么它不工作。

    <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 回复  |  直到 16 年前
        1
  •  3
  •   Katriel    16 年前

    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/'}]
    
        2
  •  3
  •   Steven    16 年前

    如果您刚开始使用xml和python,并且没有令人信服的理由使用DOM,我强烈建议您看看elementtreeapi(在中的标准库中实现) 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
  •  0
  •   Brian    16 年前

    您没有从DOM的角度考虑XML。也就是说,“C:/Something”不是标记名为“fileName”的元素的nodevalue;而是作为标记名为“fileName”的元素的第一个子元素的文本节点的nodevalue。

    我建议您做的是在python本身中使用它:启动python。

    x=minidom.parseString(“<响应><文件名>C:/</filename>”)

    ... x、 getElementsByTagName('响应')[0].childNodes[0] ...

        4
  •  0
  •   Wai Yip Tung    16 年前

    我推荐我的图书馆 xml2obj

    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