python中读取xml文件

Python 有三种方法解析 XML : SAX,DOM,以及 ElementTree,本博客主要是讲解DOM和ElementTree

DOM解析方法:

xml文件解析首先将xml文件加载进内存,然后读取文件中的内容.在内存将文件以树的结构进行保存,树根在上,树枝在下,整个xml文件被封装为Document对象,文件中的标签节点被封装为Node对象,标签节点中保存但数据被封装为Text对象

Document:表示整个文件对象

Node:表示标签对象

Text:表示标签中数据的内容

下面的讲解内容都是在下面这个xml文件中操作:



  
    
      
      
      
      
    
    
      
      
      
      
      
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
      
      
      
      
      
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
      
      
      
      
      
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
      
      
      
      
      
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
      
      
      
      
      
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
      
      
      
      
      
    
    
  

2.1. 读取xml文件

python中自带xml,不需要安装,注意项目中文件名不要为xml.py

import xml.dom.minidom
dom = xml.dom.minidom.parse('test.xml')  #解析xml文件
root = dom.documentElement   #获取xml文档对象,对象类型是Element对象,并且是根节点
print(root.nodeName)    #打印根结点的名字
print(root.nodeValue)   #打印根结点的名字,只对文本节点有效(/p,/li等等)
print(root.nodeType)    #打印结点类型

2.2  getElementsByTagNameNS:返回某个结点下具有指定标记

的所有节点列表(可以使用这个方法+for来遍历xml文档)

testList = root.getElementsByTagName('test')   #获取/root结点下所有标记为test结点,有13个
for item in testList:
    testChildList = item.getElementsByTagName('item')#获取每个test下的所有标记为item结点
    print(testChildList)

2.3. 获取标签中属性值和文本内容

#xml文件

  
  
  
  

hello

import xml.dom.minidom dom = xml.dom.minidom.parse('test.xml') root = dom.documentElement #students结点 print(root.getAttribute('name')) testList = root.getElementsByTagName('student') print(len(testList)) for item in testList: print(item.getAttribute('name')) #获取标签对应的属性值 print(item.firstChild.data) #获取标签的text值

ElementTree解析方法

与DOM相比,ET的速度更快,API使用更直接、方便.

Element对象方法:

类方法 说明
Element.iter(tag=None) 遍历该Element所有后代,也可以指定tag进行遍历寻找。
Element.iterfind(path, namespaces=None) 根据tag或path查找所有的后代。
Element.itertext() 遍历所有后代并返回text值。
Element.findall(path) 查找当前元素下tag或path能够匹配的直系节点
Element.findtext(path, default=None, namespaces=None) 寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
Element.find(path) 查找当前元素下tag或path能够匹配的首个直系节点。
Element.text 获取当前元素的text值。
Element.get(key, default=None) 获取元素指定key对应的属性值,如果没有该属性,则返回default值。
Element.keys() 返回元素属性名称列表
Element.items() 返回(name,value)列表
使用list() 变成可遍历的数组
Element.getiterator(tag=None)
Element.getiterator(self, tag=None)

实战案例:

from xml.etree import ElementTree as ET
tree = ET.parse('test.xml')
p = tree.findall('./user/test')
create_time = []
#baseTime 为开始和结束中name_menu="auto"的平均值作为baseTime
#求baseTime
baseTime = defaultdict(list)
# root.hasChildNodes()
for oneper in p:  #遍历test
    id_menu = oneper.attrib['id_menu']
    name_menu = oneper.attrib['name_menu']
    if name_menu == 'auto' and len(list(oneper))>0:
        for child in list(oneper):  #遍历item
            if 'Time_Geo1' not in child.attrib.keys():
                break
            time_Geo1 = child.attrib['Time_Geo1']
            type_Ge01 = child.attrib['Type_Geo1']
            time_Geo2 = child.attrib['Time_Geo2']
            h_Geo = child.attrib['H_Geo']
            time_DrawDone = child.attrib['Time_DrawDone']
            h_Line = child.attrib['H_Line']
            if len(baseTime[type_Ge01]) == 0:
                baseTime[type_Ge01].append(0)
                baseTime[type_Ge01].append(0)
                baseTime[type_Ge01].append(0)
            # print(float(time_Geo2))
            baseTime[type_Ge01][0] += float(time_Geo2)-float(time_Geo1)
            baseTime[type_Ge01][1] += float(time_DrawDone) - float(time_Geo2)
            baseTime[type_Ge01][2] += 1

for k in baseTime.keys():
    baseTime[k][0] = baseTime[k][0]/baseTime[k][2]
    baseTime[k][1] = baseTime[k][1]/baseTime[k][2]
# print(baseTime)
#计算time1,time2
# data = pd.DataFrame()
res = []
for oneper in p:  # 遍历test
    id_menu = oneper.attrib['id_menu']
    name_menu = oneper.attrib['name_menu']
    if name_menu != 'auto' and len(list(oneper)) > 0:
        for child in list(oneper):  # 遍历item
            if 'Time_Geo1' not in child.attrib.keys():
                break
            time_Geo1 = child.attrib['Time_Geo1']
            type_Ge01 = child.attrib['Type_Geo1']
            time_Geo2 = child.attrib['Time_Geo2']
            h_Geo = child.attrib['H_Geo']
            time_DrawDone = child.attrib['Time_DrawDone']
            h_Line = child.attrib['H_Line']
            if len(baseTime[name_menu]) == 0:
                baseTime[name_menu].append(0)
                baseTime[name_menu].append(0)
            time01 = float(time_Geo2) - float(time_Geo1) - baseTime[name_menu][0]
            time02 = float(time_DrawDone) - float(time_Geo2) - baseTime[name_menu][1]
            res.append([id_menu,name_menu,time01,time02])
print('res',res)

你可能感兴趣的:(xml,python)