今日分享
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...