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.遍历根节点可以获得子节点,然后就可以根据需求拿到需要的字段
方式二: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') #解析文档
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') #解析文档
相关文章推荐
- XML学习以及python解析xml笔记
- 利用python解析xml, json
- Python解析xml文档
- python 文本解析 XML基础
- python解析xml文档实例
- [Python]快速解析数据库视图XML配置获取数据库字段说明
- Python之XML解析详解
- python解析xml文件实例分析
- python解析xml并按照其结构输出
- Python的html和xml解析库Beautiful Soup
- python解析Testlink导出的xml并写入excel 推荐
- python 之模块之 xml.dom.minidom解析xml
- python解析html/xml
- python DOM解析XML
- python解析gbk编码的xml
- python对XML的解析
- Python解析XML
- Python解析xml-pybatis的准备阶段(八)
- python XML解析--xml.etree.ElementTree
- python 解析xml 文件: DOM 方式