您的位置:首页 > 编程语言 > Python开发

python中xml解析

2018-03-15 11:38 447 查看
python中有三种方法解析xml,SAX,DOM,以及ElementTree:
    1.SAX (simple API for XML )

          python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回       调函数来处理XML文件。
    2.DOM(Document Object Model)

          将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
    3.ElementTree(元素树)
    ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

    注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内    存少,但需要用户实现回调函数(handler)。

xml文件格式介绍:tag,即标签;attri,即属性;text,即文本字符串

#文件名:countrys.xml
<?xml version="1.0"?> <!--XML声明-->
<data id='0314' name="国家"> <!--根元素-->
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<code>141100</code>
<neighbor direction="E">Austria</neighbor>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<code>13600</code>
<neighbor direction="W">Costa Rica</neighbor>
</country>
</data>

方式一:ElementTree(元素树)

ElementTree,类似一个轻量级的DOM解析XML文件的过程:

1.导入ElementTree
2.解析xml文件找到根节点:直接解析xml文件并获得根节点
3.遍历根节点可以获得子节点,然后就可以根据需求拿到需要的字段

import xml.etree.ElementTree as ET   #1.导入ElementTree
tree=ET.parse('countrys.xml')
root=tree.getroot()                  #2.直接加载解析xml文件并获得根节点
print('根节点:',root.tag,'根属性:',root.attrib,'根文本:',root.text)
for child in root:         #3.
print('节点:',child.tag,'节点属性:',child.attrib,'节点文本:',child.text)
for sub in child:
print('子节点:',sub.tag,'子节点属性:',sub.attrib,'子节点文本:',sub.text)

方式二:DOM(Document Object Model)

一个 DOM 的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。python中用xml.dom.minidom来解析xml文件from xml.dom.minidom import parse
import xml.dom.minidom
DOMTree=xml.dom.minidom.parse('countrys.xml') #使用minidom解析器打开xml文件
date=DOMTree.documentElement #获取根节点
if date.hasAttribute('name'):
print('date.name=',date.getAttribute('name'))
countrys=date.getElementsByTagName('country') #获取所有子节点
for country in countrys:
if country.hasAttribute('name'):
print('country name:',country.getAttribute('name'))
rank=country.getElementsByTagName('rank')[0]
print('rank:',rank.childNodes[0].data)
neighbor=country.getElementsByTagName('neighbor')[0]
print('neighbor:',neighbor.childNodes[0].data)
print('---------------------')
方式三:SAX (simple API for XML )

SAX是一种基于事件驱动的API,利用SAX解析XML牵涉到两个部分:解析器和事件处理器。其中解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler

import xml.sax
#创建属于自己的读取xml文件的handler格式
class countryHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentDate='' #中间量,用来存储读取到的节点名字
self.rank=''
self.year=''
self.neighber=''
def startElement(self,tag,attributes):
#startElement(tag, attrs)方法,遇到XML开始标签时调用,tag是标签的名字,attrs是标签的属性值字典
self.CurrentDate=tag
if tag=='country':
name=attributes['name']
print('-----------------------')
print('country:',name)
def characters(self,content):
if self.CurrentDate=='rank':
self.rank=content
elif self.CurrentDate=='year':
self.year = content
elif self.CurrentDate=='neighbor':
self.neighbor=content
def endElement(self,tag):
#endElement(name)方法,遇到XML结束标签时调用
if self.CurrentDate=='rank':
print('rank:',self.rank)
elif self.CurrentDate=='year':
print('year:',self.year)
elif self.CurrentDate=='neighbor':
print('neighbor:',self.neighbor)
self.CurrentDate='' #
if __name__=='__main__':
parser=xml.sax.make_parser() #创建一个xml读取器
parser.setFeature(xml.sax.handler.feature_namespaces,0)
handler=countryHandler() #
parser.setContentHandler(handler)
parser.parse('countrys.xml') #解析文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: