天天看點

Python文法之Xml 解析

Python文法之Xml 解析

Python3 涉及XML解析功能代碼:

import io
import sys
import xml.dom.minidom #dom解析依賴包
import xml.sax #sax 解析依賴包
import xml.etree.ElementTree as ET # ElementTree 解析依賴包
from types import MethodType,FunctionType #判斷函數是函數對象還是對象方法
sys.stdout = io.TextIOWrapper(sys.stdout.detach(),encoding='utf-8')

# Python3 支援xml 解析之dom
# 讀取檔案
dom = xml.dom.minidom.parse('test.xml')
print(isinstance(xml.dom.minidom.parse,FunctionType))
# 擷取文檔元素對象
data = dom.documentElement
# 擷取 student
stus = data.getElementsByTagName('student')
for stu in stus:
	# 擷取标簽屬性值
    st_id = stu.getAttribute('id')
    st_name = stu.getAttribute('name')
	# 擷取标簽中内容
    id = stu.getElementsByTagName('id')[0].childNodes[0].nodeValue
    name = stu.getElementsByTagName('name')[0].childNodes[0].nodeValue
    age = stu.getElementsByTagName('age')[0].childNodes[0].nodeValue
    gender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValue
    print('st_id:', st_id,  ', st_name:',st_name)
    print('id:', id, ', name:', name, ', age:', age, ', gender:',gender)

# Python3 支援xml 解析之sax
class StudentHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.id = ""
        self.name = ""
        self.age = ""
        self.gender = ""

    # 元素開始調用
    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "student":
            stu_name = attributes["name"]
            print("stu_name:", stu_name)

    # 元素結束調用
    def endElement(self, tag):
        if self.CurrentData == "id":
            print("id:", self.id)
        elif self.CurrentData == "name":
            print("name:", self.name)
        elif self.CurrentData == "age":
            print("age:", self.age)
        elif self.CurrentData == "gender":
            print("gender:", self.gender)
        self.CurrentData = ""

    # 讀取字元時調用
    def characters(self, content):
        if self.CurrentData == "id":
            self.id = content
        elif self.CurrentData == "name":
            self.name = content
        elif self.CurrentData == "age":
            self.age = content
        elif self.CurrentData == "gender":
            self.gender = content

 # 建立 XMLReader
parser = xml.sax.make_parser()
# 關閉命名空間
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重寫 ContextHandler
Handler = StudentHandler()
parser.setContentHandler(Handler)
parser.parse("test.xml")
print('id:', Handler.id, ', name:', Handler.name, ', age:', Handler.age, ', gender:',Handler.gender)

# Python3 支援xml 解析之ElementTree
tree = ET.parse("test.xml")
# 根節點
root = tree.getroot()
# 标簽名
print('root_tag:',root.tag)
for stu in root:
    # 屬性值
    print ("stu_name:", stu.attrib["name"])
    # 标簽中内容
    print ("id:", stu[0].text)
    print ("name:", stu[1].text)
    print("age:", stu[2].text)
    print("gender:", stu[3].text)
           

繼續閱讀