使用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处理模块
可以使用该模块提供的”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"))
程序运行结果如下:
Python代码
(<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”如下:
Python代码
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"))
程序运行结果如下:
Python代码
(<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”如下:
Python代码
import xml.etree.ElementTree
from StringIO import StringIO
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()))
程序运行结果如下:
Python代码
(<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
libxml2是使用C语言开发的xml解析器,是一个基于MIT License的免费开源软件,多种编程语言都有基于它的实现,如本文将会介绍的lxml模块。实例“get_xpath_1”如下:
Python代码
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()
程序运行结果如下:
Python代码
(<xmlNode (data) object at 0x9326c6c>, 'data', ('version', '1.0'))
观察上面的运行结果,能够满足我们的需求,有点小不足“xpathEval()”接口不支持类似模板的用法,但不影响使用,由于libxml2采用C语言开发的,因此在使用API接口的方式上难免会有点“水土不服”(写法或习惯性用法)
lxml
lxml是以上述介绍过的libxml2为基础采用python语言开发的,从使用层面上说比libxml2更适合python开发者(鄙人感受),且"xpath"接口支持类似模板的用法,实例“get_xpath_2”如下:
Python代码
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()))
程序运行结果如下:
Python代码
(<Element data at a1f784c>, 'data', [('version', '1.0'), ('url', 'http://***')])
xpath
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"))
程序运行结果如下:
Python代码
(<DOM Element: data at 0x89934cc>, u'data', u'1.0')
总结
通过对这些类库的实践,我们已经了解了python在处理xml格式的数据时有各种各样的选择,并得知这些类库各自擅长那些方面的处理和各种类库的使用手法,可以根据实际需求选择合适的类库完成开发工作。
<二 python写XML文件> 转自 http://lulinbest.blog.sohu.com/75921823.html
相关推荐
Python写xml文件, 读取xml文件信息。 内容包含代码实例,以及xml文件格式参考。
用python读写xml文件,调用库来完成对xml的读写
python读写xml,可增删改查,插入
提供简单python读取xml方式,适用于简单xml文件读取功能
由于生成excel,所以没必要让用户选择xml文件,默认对指定文件夹下的所有的XML文件进行转换,并把转换得到的Excel放在指定文件夹。 运行时可以双击.py文件(看不到具体log); 或者按住shift同时鼠标右键,选择在此处...
python 读写xml示例,包括创建节点,修改节点,删除节点等操作,xml如下 <?xml version="1.0" encoding="UTF-8"?> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis ...
详解 Python 读写XML文件的实例 Python 生成XML文件 from xml.dom import minidom # 生成XML文件方式 def generateXml(): impl = minidom.getDOMImplementation() # 创建一个xml dom # 三个参数分别对应为 :...
Python编写界面,与xml关联,解析xml的问题。
示例了利用python对不同层的xml文件进行直接读取的方法。
python对XML文件的操作 1、xml 创建 import xml.etree.ElementTree as ET new_xml=ET.Element('personinfolist') #最外面的标签名 personinfo=ET.SubElement(new_xml,'personinfo',attrib={'enrolled':'aaa'}) #...
主要介绍了Python3 xml.etree.ElementTree支持的XPath语法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本文实例讲述了Python使用minidom读写xml的方法。分享给大家供大家参考。具体分析如下: 一 python提供的xml支持 2种工业标准的xml解析方法-SAX和DOM。SAX(simple API for XML),是基于事件处理的,当XML文档顺序...
主要介绍了Python创建xml文件的方法,结合实例形式分析了Python针对xml格式数据及文件读写相关操作技巧,需要的朋友可以参考下
python解析xml文件,并对关键字进行匹配,其中包括中文字典树的建立
今天小编就为大家分享一篇对python修改xml文件的节点值方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Python XML 解析 什么是 XML?...Python 对 XML 的解析 常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。 Python 有三种方法解析 XML,SAX,DOM,以及 Element
简单的xml文件操作程序 使用pyqt5实现图行化界面,可以进行xml文件的增删改查,源代码见文件,简单易看懂
主要介绍了python解析xml文件方式(解析、更新、写入),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧