PYTHON 讀寫XML檔案

來源:互聯網
上載者:User
python 讀寫XML
(原文轉自http://zc0604.iteye.com/blog/1520703 )<一 python讀XML檔案> 轉自http://hi.baidu.com/heelenyc/blog/item/4062fd0b57c75294d1581b09.htmlPython處理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 ElementTreefrom xml.etree.ElementTree import Elementfrom xml.etree.ElementTree import SubElementfrom xml.etree.ElementTree import dumpfrom xml.etree.ElementTree import Commentfrom 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 documentbook = 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-993933SubElement(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 documentprint 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,] )## 1. From standard XML element, it becomes root elementprint ElementTree(item).getroot().find('name').text## 2. From XML fileprint ElementTree(file='book.xml').getroot().find('item/description').text## Create an iteratorfor element in purchaseorder.getiterator():    print element.tag## Get pretty lookdef 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 elemif __name__=="__main__":    dump(indent(purchaseorder))    book.write('book.xml',"utf-8")

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.