6-3 如何解析簡單的XML文檔
阿新 • • 發佈:2018-04-28
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(r‘C:\視頻\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 instancehelp(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文檔