1. 程式人生 > >6-3 如何解析簡單的XML文檔

6-3 如何解析簡單的XML文檔

lis elf eth ide clas get 遞歸 print 直接

技術分享圖片

元素節點、元素樹

>>> from xml.etree.ElementTree import parse
技術分享圖片
>>> help(parse)
Help on function parse in module xml.etree.ElementTree:

parse(source, parser=None)
help(parse)
>>> f  = open(rC:\視頻\python高效實踐技巧筆記\6數據編碼與處理相關話題\linker_log.xml)
>>> 
>>> et = parse(f)    #
et ElementTree的對象
技術分享圖片
>>> help(et.getroot)
Help on method getroot in module xml.etree.ElementTree:

getroot(self) method of xml.etree.ElementTree.ElementTree instance
help(et.getroot)
>>> root = et.getroot() #獲取根節點 是一個元素對象

>>> root
<Element DOCUMENT at 0x2e87f90>

#此節點的屬性

>>> root.tag               #查看標簽
DOCUMENT

>>> root.attrib               #查看屬性,是一個字典,本例中有值,無值時為空
{gen_time: Fri Dec 01 16:04:26 2017 }

>>> root.text                #查看節點文本,是一個回車無自符串
\n
>>> root.text.strip()        #將節點文本對 空白字符串過濾
‘‘

>>> root.text.strip()

 ‘‘

技術分享圖片

#root自身是一個可叠代對象,直接進行叠代遍歷子元素

>>> for child in root:
    print(child.get(id))  #child表示子元素 get()方法是獲取某一屬性。

輸出結果

01ABBC90

01BF8610

01BF8AF0

01BFC5F0

01BFE3E8

01BFE850

01BFEAC8

01BFF128

01BFF2B0

01BFF4B8

01BFF730

01BFF960

01BFFB68

#通過find()、findall()、iterfind()只能找當前元素的直接子元素如本例中”root”只能找”MSG”而不能找”TEXT”

>>> root.find(MSG)       #find()找到第一個碰到的元素
<Element MSG at 0x2e87fd0>
>>> root.find(MSG)
<Element MSG at 0x2e87fd0>
>>> root.findall(MSG)    #find()找到所有的元素
[<Element MSG at 0x2e87fd0>, <Element MSG at 0x2e9f0d0>, <Element MSG at 0x2e9f170>, <Element MSG at 0x2e9f210>, <Element MSG at 0x2e9f2b0>, <Element MSG at 0x2e9f350>, <Element MSG at 0x2e9f3f0>, <Element MSG at 0x2e9f490>, <Element MSG at 0x2e9f530>, <Element MSG at 0x2e9f5d0>, 

>>> root.find(TEXT)      #“TEXT”是”MSG”的子元素,所以root直接find()找不到
>>> 
>>> msg = root.find(MSG)
>>> msg.find(TEXT)
<Element TEXT at 0x2e9f090>


#iterfind()  生成可叠代對表
>>> iterMsg = root.iterfind(MSG)
>>> for i in xrange(5):
    x = iterMsg.next()
    print x.get(id)

輸出

01BF8610

01BF8AF0

01BFC5F0

01BFE3E8

01BFE850

>>> iterMsg = root.iterfind(MSG)
>>> i = 0
>>> for x in iterMsg:
    print(x.get(id))
    i+=1
    if(i ==5):
        break

輸出結果:

01ABBC90

01BF8610

01BF8AF0

01BFC5F0

01BFE3E8

#iter()可以叠代出所有元素的節點

>>> root.iter()
<generator object iter at 0x02ED3CD8>

技術分享圖片

#遞歸查找某一元素

>>> list(root.iter(TEXT))

技術分享圖片

三、查找高級用法

1、“*”查找所有的節點

>>> root.findall(MSG/*)   #查找MSG下的所有子節點,註意只能找其子節點而不能找其孫子節點

技術分享圖片

2、“.//”無論哪個層次下都能找到節點

>>> root.find(.//TEXT)        #能找到
<Element TEXT at 0x2e9f090>
>>> root.find(TEXT)        #不能找到
>>> 

3、“..”找到父層次的節點

>>> root.find(.//TEXT/..)
<Element MSG at 0x2e87fd0>

4、“@”包含某一屬性

>>> root.find(MSG[@name])          #沒有包含name屬性的
>>> root.find(MSG[@Type])          #沒有包含Type屬性的
>>> root.find(MSG[@type])          #存在包含type屬性的,並返回
<Element MSG at 0x2e87fd0>

5、屬性等於特定值

>>> root.find(MSG[@id="01BFE3E8"])   #註意參數裏的=號後面的字符串需要帶引號
<Element MSG at 0x2e9f2b0>

6、指定序號

>>> root.find("MSG[2]")      #找第二個
<Element MSG at 0x2e9f0d0>

>>> root.find("MSG[last()]")  #找最後一個
<Element MSG at 0x2ecdef0>

>>> root.find("MSG[last()-1]")  #找倒數第二個
<Element MSG at 0x2ecde30>

6-3 如何解析簡單的XML文檔