python解析xml的方法總結

2021-07-28 18:19:39 字數 4909 閱讀 6649

使用python開發時,由於python的開源生態圈非常的給力,對於實現同乙個功能,往往在這方面的類庫非常多,而開發者也同樣面臨著如何選擇最佳的 類庫作為輔助開發的工具。本文將記錄本人在使用python處理xml格式資料時測試過的類庫,有些類庫由於先天不足,無法支援一些特性,涉及的類庫或模 塊有xml(python自帶)、libxml2 、lxml 、xpath 。

附註:本文處理xml格式的資料的結構如下:

可以使用該模組提供的」getelementsbytagname「介面找到需要的節點,例項「get_tagname」如下:

python**

import

xml.

dom.

minidom

defget_tagname

():doc

=xml

.dom

.minidom

.parsestring

(input_xml_string

)for

node

indoc

.getelementsbytagname

("data"

):print

(node

,node

.tagname

,node

.getattribute

("version"

))

程式執行結果如下:

(

, u'data', u'1.0') (

, u'data', u'2.0')

(

, u'data', u'1.0')

(

, u'data', u'2.0')

觀察上面的執行結果,」getelementsbytagname「介面查詢名為data的所有節點,有時候,程式需要完成的功能是只需要某個節點下面的 data節點,如other節點下的data節點。也許您馬上想到了,我們可以判斷data節點的父節點是否為other來滿足功能,例項 「get_tagname_other」如下:

import

xml.

dom.

minidom

defget_tagname_other

():doc

=xml

.dom

.minidom

.parsestring

(input_xml_string

)for

node

indoc

.getelementsbytagname

("data"

):if

node

.parentnode

.tagname

=="other"

:print

(node

,node

.tagname

,node

.getattribute

("version"

))

程式執行結果如下:

(

, u'data', u'1.0') (

, 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

indoc

.findall

("//item/data"

):print

(node

,node

.tag,(

node

.items

()))

程式執行結果如下:

, 'data', [('url', 'http://***'), ('version', '2.0')])觀察上面的執行結果,使用xpath的方式顯然改善了程式的可讀性,可依然沒有解決上面的問題,這是由於python自帶的xml模組對xpath方式的支援先天不足,如果想同時滿足可讀性與功能的正確性,我們需要使用針對python的第三方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()

程式執行結果如下:

(

, 'data', ('version', '1.0'))

觀察上面的執行結果,能夠滿足我們的需求,有點小不足「xpatheval()」介面不支援類似模板的用法,但不影響使用,由於libxml2採用c語言開發的,因此在使用api介面的方式上難免會有點「水土不服」(寫法或習慣性用法)

lxml是以上述介紹過的libxml2為基礎採用python語言開發的,從使用層面上說比libxml2更適合python開發者(鄙人感受),且"xpath"介面支援類似模板的用法,例項「get_xpath_2」如下:

import

lxml

.etree

defget_xpath_2

():doc

=lxml

.etree

.parse

(file

)for

node

indoc

.xpath

("//item/data[@version = $name]"

,name

="1.0"

):print

(node

,node

.tag,(

node

.items

()))

程式執行結果如下:

(

, 'data', [('version', '1.0'), ('url', 'http://***')])

xpath是python官方推薦的乙個支援xpath等處理的模組,是基於本文介紹過的python自帶xml處理模組擴充套件而成,可以很好的結合使用,同時「find」介面也支援類似模板的用法,例項「get_xpath_3」如下:

python**

import

xpath

defget_xpath_3

():doc

=xml

.dom

.minidom

.parsestring

(input_xml_string

)for

node

inxpath

.find

("//item/data[@version = $name]"

,doc

,name

="1.0"

):print

(node

,node

.tagname

,node

.getattribute

("version"

))

程式執行結果如下:

(

, u'data', u'1.0')

總結:

通過對這些類庫的實踐,我們已經了解了python在處理xml格式的資料時有各種各樣的選擇,並得知這些類庫各自擅長那些方面的處理和各種類庫的使用手法,可以根據實際需求選擇合適的類庫完成開發工作。

0

給主人留下些什麼吧!~~

解析xml的方法

簡單的讀析xml 例子 xmlversion 1.0 encoding utf 8 table name userlist keyname number1 logname 小白 logname passwd 123456 passwd default mark disable default mar...

XML的命名空間與python解析方法

在 xml 中,元素名稱是由開發者定義的,當兩個不同的文件使用相同的元素名時,就會發生命名衝突,而xml 命名空間提供避免元素命名衝突的方法。xml 命名空間屬性被放置於元素的開始標籤之中,並使用以下的語法 xmlns namespace prefix namespaceuri 當命名空間被定義在元...

xml的sax解析方法

xml的sax解析方式在找到結點開始標誌時,呼叫 1 void parser nsxmlparser parser didstartelement nsstring elementname namespaceuri nsstring namespaceuri qualifiedname nsstri...