解析xml Python解析XML檔案

2021-10-12 21:28:23 字數 4016 閱讀 3608

今日分享

python解析xml檔案

閱讀本文大概約10分鐘

xml 全稱是extensible markup language,意為可擴充套件標記語言,是一種用於標記電子檔案使其具有結構性的標記語言。xml易於擴充套件,主要用來傳輸和儲存資料,聚焦的是資料的內容。以xml結構儲存資料的檔案即為xml檔案。

python有三種方法解析xml:sax、dom、elementtree。

測試用xml檔案如下:其內容表示某儀器裝置採集遠端的資料報。

<?xml  version="1.0" encoding="utf-8"?>

1002001id>  

002008010217-1090name>  

20191230075505sample_time>  

15878.59consumption> 

meter>  

1003001id>  

002008010015-1090name>  

20191230075507sample_time>  

33183.7consumption> 

meter> 

data>

#sax 是一種基於事件驅動的api,涉及兩個部分:解析器(負責讀取xml檔案,並向事務處理器傳送相應的事件)和事務處理器(對事件作出響應)。先建立乙個新的xmlreader物件,然後設定xmlreader事件處理器contenthandler,最後執行xmlreader的parse()方法。逐行掃瞄文件,一次處理乙個標籤,無須事先全部讀取整個xml文件,對於大型文件的解析擁有巨大優勢。

import xml.sax

class meterhandler(xml.sax.contenthandler):

def __init__(self):

self.id = ""

self.name = ""

self.sample_time = ""

self.consumption = ""

# 元素開始呼叫

def startelement(self, tag, attributes):

self.currentdata = tag

if tag == "student":

met_id = meter.getattribute('id')

met_name = meter.getattribute('name')

print("met_id:", met_id,"met_name:", met_name)

# 元素結束呼叫

def endelement(self, tag):

if self.currentdata == "id":

print(f"id:")

elif self.currentdata == "name":

print(f"name:")

elif self.currentdata == "sample_time":

print(f"sample_time:")

elif self.currentdata == "consumption":

print(f"consumption:")

else:

pass

self.currentdata = ""

# 讀取字元時呼叫

def characters(self, content):

if self.currentdata == "id":

self.id = content

elif self.currentdata == "name":

self.name = content

elif self.currentdata == "sample_time":

self.sample_time = content

elif self.currentdata == "consumption":

self.consumption = content

else:

pass

if (__name__ == "__main__"):

# 建立 xmlreader

parser = xml.sax.make_parser()

# 關閉命名空間

parser.setfeature(xml.sax.handler.feature_namespaces, 0)

# 重寫 contexthandler

handler = meterhandler()

parser.setcontenthandler(handler)

parser.parse(r".\test73\test1.xml")

#文件物件模型dom是w3c組織推薦的處理可擴充套件標記語言標準程式設計介面,dom解析器在解析xml文件時,一次性讀取整個文件,資料在記憶體中解析成乙個樹結構裡,通過dom中函式讀取或修改文件內容和結構。

from xml.dom.minidom import parse

import xml.dom.minidom

# 讀取檔案

domtree =xml.dom.minidom.parse(r'.\test73\test1.xml')

# 獲取文件元素物件

data = domtree.documentelement

# 獲取 meter

meters = data.getelementsbytagname('meter')

for meter in meters:

# 獲取標籤屬性值

met_id = meter.getattribute('id')

met_name = meter.getattribute('name')

# 獲取標籤中內容

id = meter.getelementsbytagname('id')[0].childnodes[0].nodevalue

name = meter.getelementsbytagname('name')[0].childnodes[0].nodevalue

sample_time = meter.getelementsbytagname('sample_time')[0].childnodes[0].nodevalue

consumption = meter.getelementsbytagname('consumption')[0].childnodes[0].nodevalue

print('met_id:', met_id,  ', met_name:',met_name)

print('id:', id, ', name:', name, ', sample_time:',sample_time,"consumption",consumption)

#elementtree將xml資料在記憶體中解析成樹,通過樹來操作xml。**相當簡潔。

import xml.etree.elementtree as et

tree = et.parse(r".\test73\test1.xml")

# 根節點

root = tree.getroot()

# 標籤名

print('root_tag:',root.tag)

for met in root:

# 屬性值

print ("met_id:",met.attrib["id"])

print ("met_name:",met.attrib["name"])

# 標籤中內容

IOS內建NSXMLParser解析xml

nsxmlparser解析xml格式的資料 用法如下 首先,nsxmlparser必須繼續nsxmlparserdelegate協議 inte ce xmlhelper nsobject 首先設定xml資料,並初始化nsxmlparser void viewdidload 遍例xml的節點 void...

使用原生的NSXmlParser解析xml資料

下面是本人使用原聲nsxmlparser對xml資料進行的解析。這裡有篇有一篇很不錯的教程,使用gdataxml庫對xml資料進行的解析,而且還有對xml資料格式的組建,講解的很是詳細。import viewcontroller.h pragma mark xml解析器 xml資料解析器 inte ...

使用RXMLElement工具類解析XML

現在來寫一篇我最近使用過的一種xml解析的方法的文章。xml解析有多種多樣的方法,包括蘋果自帶的方法和各種工具類,今天我只介紹用rxmlelement的工具類來解析xml。使用步驟 1.首先把xml解析類匯入工程 2.然後在加入框架libxml2.dylib 3.最後把header search p...