使用python开发时,由于python的开源生态圈非常的给力,对于实现同一个功能,往往在这方面的类库非常多,而开发者也同样面临着如何选择最佳的
类库作为辅助开发的工具。本文将记录本人在使用python处理xml格式数据时测试过的类库,有些类库由于先天不足,无法支持一些特性,涉及的类库或模
块有xml
(python自带)、libxml2
、lxml
、xpath
。
附注:本文处理xml格式的数据的结构如下:
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”如下:
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.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()))
程序运行结果如下:
(<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”如下:
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
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
xpath是python官方推荐的一个支持xpath等处理的模块,是基于本文介绍过的python自带xml处理模块扩展而成,可以很好的结合使用,同时“find”接口也支持类似模板的用法,实例“get_xpath_3”如下:
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格式的数据时有各种各样的选择,并得知这些类库各自擅长那些方面的处理和各种类库的使用手法,可以根据实际需求选择合适的类库完成开发工作。
分享到:
相关推荐
例如,Java中的JAXB(Java Architecture for XML Binding)用于对象与XML之间的绑定,DOM4J提供DOM接口的增强,而Python的xml.etree.ElementTree是内置的XML处理模块。这些类库简化了XML处理,使得开发者无需关注...
- **.NET Framework的XML类库**:C#和VB.NET中的XML处理工具。 通过深入学习这些知识点,并结合提供的原代码实例,你将能够熟练地创建、解析和操作XML文档,无论是在Web开发、数据存储还是系统集成中,XML都能成为...
"Python 电子书合集1" 提供了丰富的学习资源,包括 "Python语言入门.pdf" 和 "python类库英文版.pdf",旨在帮助初学者和进阶者深入理解Python。 "Python语言入门.pdf" 很可能是一本适合初学者的基础教程,它通常会...
这个类库可能适用于多种编程语言,如Java、Python、C#或JavaScript等,使得开发者能够轻松地在XML和JSON之间进行数据互换。 描述中的重复内容强调了这个类库的直接可用性,意味着它可能提供了简单易用的API,允许...
- **Python的xml.etree.ElementTree**: 提供了轻量级的XML处理API。 - **.NET Framework的System.Xml**: 提供了处理XML的各种类库。 综上所述,XML作为数据交换和存储的通用格式,在信息技术领域有着广泛的应用。...
- C#的`System.Xml`和`System.IO`类库分别用于XML和TXT文件操作。 - 除此之外,还有许多第三方库,如Python的`lxml`(高速XML处理)、`BeautifulSoup`(HTML和XML解析)和`pandas`(数据分析,支持TXT文件读写)等...
官方示例来自Eclipse Paho项目,Paho是Eclipse的一个开源项目,提供了多种语言的MQTT客户端实现,包括Java、C、Python等,而Android版的Paho MQTT库就是这个E4A类库的基础。 在压缩包中,"主窗口代码.cde"是E4A应用...
4. **丰富的类库**:Python拥有大量的内置库和第三方库,例如用于文件处理、正则表达式、网络通信等,极大地方便了编程工作。 5. **交互式命令行**:Python的交互式命令行便于测试代码片段和学习。 6. **可扩展性**...
9. **XML/JSON解析**:解析和生成XML或JSON数据的工具,用于数据交换或配置文件处理。 10. **时间日期处理**:提供对日期和时间的操作,如日期格式化、时间间隔计算等,有助于处理时间相关的业务逻辑。 11. **国际...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、自解释性和可扩展性而被广泛...在实际项目中,可以根据需求进一步封装成易于使用的函数或类库,以提高代码复用性和可维护性。
接着,需要在Python脚本中引入必要的类库: ```python from suds.client import Client ``` #### 接口调用示例 接口调用过程通常分为以下几个步骤: 1. **初始化客户端**:创建一个`Client`对象,并通过`set_...
该项目是一款基于Java的BuilderProject设计源码,集成了C/C++、Python等多语言的构建工具类库。该类库包含310个文件,其中HTML文件93个、Java文件56个、PNG文件29个、XML文件18个、TXT文件16个、Python文件15个、JPG...
在IT行业中,Python是一种广泛应用的编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱。"Python-Python写的工具类"这个标题...深入研究这个工具库,可以提升开发效率,同时也能学习到Python编程的最佳实践。
这可能通过编程语言如Python、Java或.NET框架中的类库实现,例如Python的pandas库,Java的Apache POI库,或者C#中的EPPlus库。 4. **源码实例**:这个XML2Excel2.0_51aspx可能是一个基于ASP.NET的Web应用程序,用于...
总之,这个压缩包提供了与XML文件操作相关的各种资源,涵盖了从基础的读写操作到特定开发环境下的应用实例,对于学习和实践XML处理非常有价值。了解和掌握XML的使用,无论是对于数据交换、配置管理还是软件开发,都...
- LINQ to XML(C#):.NET Framework提供的一种高效且易于使用的XML处理方式,可以直接通过类库操作XML文档。 4. 文件内容分析: SolidWorks的.xml文件可能包含以下内容: - 零部件和装配体的几何信息:面、边...
Jython是一种Python解释器,它是用Java编写的,可以直接运行Java类库,使得Python代码可以无缝调用Java方法。而JyNI则是一个C++库,允许Python程序直接调用Java的本地接口(JNI)。在这个项目中,可能使用了Jython,...
例如,对于数据处理,类库可能包含解析XML或JSON、数据库操作、文件读写等功能;在网络通信方面,类库可能提供HTTP请求、WebSocket支持、FTP上传下载等服务;在GUI方面,它们可能包含窗口管理、控件绘制、事件处理等...
2. **数据转换工具**:为了使不同程序间的数据交换变得简单,类库可能包含数据格式转换的函数,如JSON、XML、CSV之间的转换。 3. **通信协议**:可能包含了HTTP、TCP/IP或其他网络通信协议的实现,用于不同程序间的...