`

python 读写XML

 
阅读更多
Python处理XML

 使用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中的minidom写过生成XML文件的程序,现在需要读取XML文件中的内容了,首先想到的还是minidom模块.一番编写测试后,如愿掌握了其函数的使用方式,和AJAX中的DOM操作没什么区别.

  以前就知道elementtree在处理XML文件时广受Python程序员的欢迎,也安装过elementtree的安装包,现在使用的Python2.5中已将其收录了.既然我要处理XML文件,当然也要学着使用更高效和易用的模块了.自己摸索了半天,除了有关名字空间的函数没有试用外,其它函数都试用过了.以后处理XML文件可以得心应手了。

下面是一个简单的例子,通过它可以知道各个函数的使用方法:
 

from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import dump
from xml.etree.ElementTree import Comment
from xml.etree.ElementTree import tostring

'''
<?xml version="1.0"?>
<PurchaseOrder>
  <account refnum="2390094"/>
  <item sku="33-993933" qty="4">
    <name>Potato Smasher</name>
    <description>Smash Potatoes like never before.</description>
  </item>
</PurchaseOrder>
'''

## Writing the content to xml document
book = ElementTree()

purchaseorder = Element('PurchaseOrder')
book._setroot(purchaseorder)

SubElement(purchaseorder,  'account', {'refnum' : "2390094"})

item = Element("item", {'sku' : '33-993933', 'qty' : '4'})
purchaseorder.append(item)
print item.items()       # [('sku', '33-993933'), ('qty', '4')]
print item.attrib        # {'sku': '33-993933', 'qty': '4'}
print item.get('sku')    # 33-993933
SubElement(item, 'name').text = "Potato Smasher"
SubElement(item, 'description').text = "Smash Potatoes like never before."

#book.write('book.xml',"utf-8")

#print tostring(purchaseorder)

#import sys
#book.write(sys.stdout)

#dump(book)

## Displaying the content of the xml document
print purchaseorder.find('account')
print purchaseorder.find('account').get('refnum')
print purchaseorder.findall('account')[0].get('refnum')

print purchaseorder.find('item/name')
print purchaseorder.find('item/name').text

## How to use ElementTree([element,] [file])
## 1. From standard XML element, it becomes root element
print ElementTree(item).getroot().find('name').text
## 2. From XML file
print ElementTree(file='book.xml').getroot().find('item/description').text


## Create an iterator
for element in purchaseorder.getiterator():
    print element.tag


## Get pretty look
def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        for e in elem:
            indent(e, level+1)
        if not e.tail or not e.tail.strip():
            e.tail = i
    if level and (not elem.tail or not elem.tail.strip()):
        elem.tail = i
    return elem

if __name__=="__main__":
    dump(indent(purchaseorder))
    book.write('book.xml',"utf-8")
分享到:
评论

相关推荐

    Python读写XML文件实例

    在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它的...通过`generate_xml.py`和`read_xml.py`这样的代码实例,开发者可以深入了解XML文件的读写操作,并在实际项目中灵活应用。

    python_XML-6-17.rar_python 文件_python xml_python读写xml_python读写xm

    在Python中,我们可以使用内置的`xml`模块来读取、解析和写入XML文件。本篇文章将详细探讨如何使用Python与XML文件进行交互。 首先,我们需要导入`xml.etree.ElementTree`模块,它是Python的标准库之一,提供了XML...

    pp.zip_python xml_python读写xml_读写 python

    总结来说,Python的`xml.etree.ElementTree`模块提供了一套强大的工具,使得XML文件的读写、修改和查询变得简单易行。无论你是新手还是经验丰富的开发者,掌握这些技能都将极大地提升你在处理结构化数据时的效率。

    使用python将xml转化为Excel

    由于生成excel,所以没必要让用户选择xml文件,默认对指定文件夹下的所有的XML文件进行转换,并把转换得到的Excel放在指定文件夹。 运行时可以双击.py文件(看不到具体log); 或者按住shift同时鼠标右键,选择在此处...

    python解析xml

    在XML解析方面,Python提供了多种库,使得处理XML文档变得简单而高效。XML(eXtensible Markup Language)是一种标记语言,用于存储和传输结构化数据,常用于Web服务、配置文件和数据交换。 Python中有两个主要的...

    python读取xml文件代码

    这个脚本可能是用来读取、解析`config.xml`文件,或者对其进行修改并保存结果。 总结来说,Python的`xml.etree.ElementTree`模块提供了强大的功能来读取、解析和操作XML文件。通过理解和应用这些概念,你可以轻松地...

    python_xml 读写

    python 读写xml示例,包括创建节点,修改节点,删除节点等操作,xml如下 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;title lang="en"&gt;Everyday Italian&lt;/title&gt; &lt;author&gt;Giada De Laurentiis ...

    python文件对比 xml、excel

    在Python编程中,处理XML和Excel文件是常见的任务,尤其在数据处理和分析领域。XML(eXtensible Markup Language)是一种结构化数据格式,常用于存储和交换数据,而Excel则是Microsoft Office套件中的一个应用程序,...

    详解 Python 读写XML文件的实例

    详解 Python 读写XML文件的实例 Python 生成XML文件 from xml.dom import minidom # 生成XML文件方式 def generateXml(): impl = minidom.getDOMImplementation() # 创建一个xml dom # 三个参数分别对应为 :...

    python读取xml文件.doc

    Python 读取 XML 文件 Python 读取 XML 文件是 Python 编程中的一种常见操作。XML(Extensible Markup Language,扩展标记语言)是一种标记语言,用于存储和传输数据。它可以用来标记数据、定义数据类型,是一种...

    Python之XML编程

    9. **案例研究**:通过实际案例,如配置文件管理、XML数据的读写,以及XML数据的分析和处理,加深对XML编程的理解。 10. **最佳实践与优化**:讨论XML编程中的最佳实践,如如何有效地处理大型XML文件,以及使用缓存...

    python解析xml生成excel文档

    将解析的XML数据写入Excel工作簿,同时根据需要对某些单元格添加颜色。 ```python def write_to_excel(data, ws, row=2, style=None): for i, item in enumerate(data): ws.cell(row=row+i, column=1).value =...

    Python3 xml.etree.ElementTree支持的XPath语法详解

    Python3的xml.etree.ElementTree模块提供了一个XML处理接口,其中包含了对XPath语言的有限支持。XPath是一种在XML文档中查找信息的语言,它允许我们基于元素的名称、属性、文本内容以及它们之间的关系来定位XML节点...

    tools_python;xml;mat文件_

    `change_xml_wh.py`则可能用于调整图像尺寸,这对图像分类、目标检测等任务很常见。 5. 脚本执行: - 用户可以通过命令行运行这两个Python脚本,例如在终端输入`python change_xml_wh.py`或`python convert_txt_...

    python读取XML文件资料集合

    使用 XMLLIB 模块可以读取 XML 文件,并对其进行处理。例如,可以使用 XMLLIB 模块来读取一个 XML 文件,并将其转换为 Python 对象。然后,可以使用 Python 对象来处理 XML 文件的内容。 Python 中还有许多其他的 ...

    python界面内输入修改xml

    当你需要在Python中通过图形用户界面(GUI)来修改XML文件时,可以利用Tkinter库来创建界面,并结合ElementTree模块来操作XML文件。下面我们将深入探讨如何实现这个功能以及可能遇到的问题。 首先,Tkinter是Python...

    python实现xml的简单操作

    通过以上步骤,你可以创建一个用户友好的界面,让用户能够直观地对XML文件进行增删改查操作。记住,在实际开发中,还要考虑到错误处理和用户体验,比如提供适当的提示信息,以及确保数据的正确性。 在提供的压缩包...

    pythonxml:重温Python的XML工具l:

    通过对Python中处理XML的几种主要工具——`xmllib`、SAX、DOM 和 ElementTree 的介绍,我们可以看出每种工具都有其适用场景。`xmllib` 更适合简单的自定义解析需求;SAX 更适用于大型文件的高效解析;DOM 提供了更加...

Global site tag (gtag.js) - Google Analytics