对于xml文本,利用python有三种方法解析:SAX,DOM和ElementTree
- DOM(Document Object Model)该方式一次性读取整个文档,把文档中所有元素存在内存中的一个树结构 里,之后利用DOM提供的函数来读取该文档的内容和结构,也可以把修改过的内容写入XML文件。如果XML文本较大,会很耗内存,故DOM适用于处理较小的XML文件。
- SAX(simple API for XML)SAX是用的是事件驱动模型,其一边读文件一边解析,占用内存少。利用SAX解析XML文档牵涉到两个部分: 解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件。而事件处理器则负责对事件作出响应,对传递的XML数据进行处理。在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler
- ElementTree(元素树)ElementTree 相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。
本文记录利用DOM解析XML文本
现有手机导出的运动数据如下:
提取脚本如下:
"""
从xml文件中读取运动数据,提取时间、运动步数
作者:挨踢的土木佬
"""
from typing import Collection
from xml.dom.minidom import parse
import xml.dom.minidom as dom
import datetime # 时间处理模块
filename = "导出.xml"
# 使用minidom解析器打开 XML 文档
DOMTree = dom.parse(filename)
data_collection = DOMTree.documentElement
health_data = data_collection.getElementsByTagName("Record")
StepDict = {}
for data in health_data:
record_type = data.getAttribute("type")
if record_type == "HKQuantityTypeIdentifierStepCount":
sourceName = data.getAttribute("sourceName")
startDate = data.getAttribute("startDate")
endDate = data.getAttribute("endDate")
value = data.getAttribute("value")
if sourceName == "小米运动": ## 先过滤出小米运动的步行数据
# print(startDate,value)
start_date = datetime.datetime.strptime(startDate.replace(" +0800",""),"%Y-%m-%d %H:%M:%S")
start_date_formated = start_date.strftime("%Y%m%d") # 格式化时间
if start_date_formated in StepDict.keys():
StepDict[start_date_formated] += int(value)
else:
StepDict[start_date_formated] = int(value)
# 对时间进行排序
sorted_list = sorted( StepDict.items() , key = lambda x:x[0] , reverse=False )
fr = open("stepdata.txt","w")
for li in sorted_list:
fr.write("{},{}\n".format(li[0],li[1]))
fr.close()
绘制出运动数据,利用plt.bar函数:
"""
绘制步数
"""
import matplotlib.pyplot as plt
def read_step_data(file):
fr = open(file,"r")
px,py = [],[]
for line in fr.readlines():
data = line.split(",")
px.append(data[0])
py.append(int(data[1]))
fr.close()
return px,py
fig = plt.figure()
ax = fig.add_subplot(111)
plotx,ploty = read_step_data("stepdata.txt")
plotx = [d for d in range(len(plotx))]
ax.bar(plotx,ploty)
plt.show()
转载请注明:XAMPP中文组官网 » python编程处理XML文本