• python 各种解析xml包使用方法总结 转


    python 各种解析xml包使用方法总结

    转 http://outofmemory.cn/code-snippet/914/python-kinds-jiexi-xml-bao-usage-method-summary

    使用python开发时,由于python的开源生态圈非常的给力,对于实现同一个功能,往往在这方面的类库非常多,而开发者也同样面临着如何选择最佳的 类库作为辅助开发的工具。本文将记录本人在使用python处理xml格式数据时测试过的类库,有些类库由于先天不足,无法支持一些特性,涉及的类库或模 块有xml(python自带)、libxml2 、lxml 、xpath 。

    附注:本文处理xml格式的数据的结构如下:

    Python代码

    input_xml_string =""" 
                       <root> 
                            <item> 
                                <data version="1.0" url="http://***" /> <data version="2.0" url="http://***"/></item><other><data version="1.0" url="http://***"/><data version="2.0" url="http://***"/></other></root>"""  

     

    python自带的xml处理模块xml.dom.minidom 解析xml

    可以使用该模块提供的”getElementsByTagName“接口找到需要的节点,实例“get_tagname”如下:

    Python代码

    import xml.dom.minidom  
    def get_tagname():  
        doc = xml.dom.minidom.parseString(input_xml_string)
    for node in doc.getElementsByTagName("data"):
    print(node, node.tagName, node.getAttribute("version"))

    程序运行结果如下:

    (<DOM Element: data at 0x89884cc>, u'data', u'1.0')  
    (<DOM Element: data at 0x898860c>, u'data', u'2.0')  
    (<DOM Element: data at 0x89887cc>, u'data', u'1.0')  
    (<DOM Element: data at 0x898890c>, u'data', u'2.0')  
    

    观察上面的运行结果,”getElementsByTagName“接口查找名为data的所有节点,有时候,程序需要完成的功能是只需要某个节点下面的 data节点,如other节点下的data节点。也许您马上想到了,我们可以判断data节点的父节点是否为other来满足功能,实例 “get_tagname_other”如下:

    import xml.dom.minidom  
    def get_tagname_other():  
        doc = xml.dom.minidom.parseString(input_xml_string)
    for node in doc.getElementsByTagName("data"):
    if node.parentNode.tagName =="other":
    print(node, node.tagName, node.getAttribute("version"))

    程序运行结果如下:

    (<DOM Element: data at 0x936b7cc>, u'data', u'1.0')  
    (<DOM Element: data at 0x936b90c>, u'data', u'2.0')  
    

    观察上面的运行结果,恩,很好,问题是解决了,但是如果我想查找other节点下的data节点且属性节点version等于1.0的那个data节点, 那么就需要添加更多的策略来筛选出我们需要的数据,显然这种方式不够灵活,因此我们想到了使用xpath的方式去搜索我们需要的节点。实例 “get_xpath”如下:

    import xml.etree.ElementTreefromStringIOimportStringIO  
    file =StringIO(input_xml_string)def get_xpath():  
        doc = xml.etree.ElementTree.parse(file)
    for node in doc.findall("//item/data"):
    print(node, node.tag,(node.items()))

    程序运行结果如下:

    (<Element data at 90c4dcc>, 'data', [('url', 'http://***'), ('version', '1.0')])  
    (<Element data at 90c4e8c>, 'data', [('url', 'http://***'), ('version', '2.0')])  
    

    观察上面的运行结果,使用xpath的方式显然改善了程序的可读性,可依然没有解决上面的问题,这是由于python自带的xml模块对xpath方式的支持先天不足,如果想同时满足可读性与功能的正确性,我们需要使用针对python的第三方xml处理类库。

     

    使用libxml2解析xml

    libxml2是使用C语言开发的xml解析器,是一个基于MIT License的免费开源软件,多种编程语言都有基于它的实现,如本文将会介绍的lxml模块。实例“get_xpath_1”如下:

    mport libxml2
    def get_xpath_1():
    doc = libxml2.parseFile("data.xml")#data.xml文件结构与上述的input_xml_string相同
    for node in doc.xpathEval("//item/data[@version = '1.0']"):
    print (node, node.name, (node.properties.name, node.properties.content))
    doc.freeDoc()
    程序运行结果如下:

    (<xmlNode (data) object at 0x9326c6c>, 'data', ('version', '1.0'))  
    

    观察上面的运行结果,能够满足我们的需求,有点小不足“xpathEval()”接口不支持类似模板的用法,但不影响使用,由于libxml2采用C语言开发的,因此在使用API接口的方式上难免会有点“水土不服”(写法或习惯性用法)

     

    使用lxml解析xml

    lxml是以上述介绍过的libxml2为基础采用python语言开发的,从使用层面上说比libxml2更适合python开发者(鄙人感受),且"xpath"接口支持类似模板的用法,实例“get_xpath_2”如下:

    import lxml.etree  
    def get_xpath_2():  
       doc = lxml.etree.parse(file) 
    for node in doc.xpath("//item/data[@version = $name]", name ="1.0"):
    print(node, node.tag,(node.items()))

    程序运行结果如下:

    (<Element data at a1f784c>, 'data', [('version', '1.0'), ('url', 'http://***')])  
    

     

    使用xpath模块解析xml

    xpath是python官方推荐的一个支持xpath等处理的模块,是基于本文介绍过的python自带xml处理模块扩展而成,可以很好的结合使用,同时“find”接口也支持类似模板的用法,实例“get_xpath_3”如下:

    Python代码

    import xpath  
    def get_xpath_3():  
       doc = xml.dom.minidom.parseString(input_xml_string)
    for node in xpath.find("//item/data[@version = $name]", doc, name ="1.0"):
    print(node, node.tagName, node.getAttribute("version"))

    程序运行结果如下:

    (<DOM Element: data at 0x89934cc>, u'data', u'1.0')  
    

    总结:

    通过对这些类库的实践,我们已经了解了python在处理xml格式的数据时有各种各样的选择,并得知这些类库各自擅长那些方面的处理和各种类库的使用手法,可以根据实际需求选择合适的类库完成开发工作。

  • 相关阅读:
    Excel jar包冲突 java.lang.NoSuchFieldError: DEFAULT
    js中foreach有三种写法,你知道吗
    上期CTP
    Visual Status各个版本官网下载
    电脑重装环境配置
    vue父子页面传值
    MySQL该使用哪种CPU架构服务器?
    【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。
    【短道速滑九】仿halcon中gauss_filter小半径高斯模糊优化的实现
    AVX图像算法优化系列一: 初步接触AVX。
  • 原文地址:https://www.cnblogs.com/viviancc/p/3094857.html
Copyright © 2020-2023  润新知