XML解析 (python)
2017-05-16 18:10
302 查看
XML XML是可扩展标记语言(eXtenensible Markup Language)(HTML是超级文本语言) XML被设计用来传输和存储数据(HTML用来显示数据) XML树结构 (XML的标签是自定义的,HTML标签是规定的)
<?xml version="1.0" encoding="UTF-8"?> #声明
<root> #根元素
<child> #子元素
<subchild>.....</subchild> #子子元素
#<tag attrib>text<tail>
</child>
</root>python对XML解析 XML编程常用接口有DOM和SAX 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(元素树) 轻量级的DOM,更友好的API.可用性更好,速度快,消耗内存少 DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX(优先)是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。 xml解析模块 xml.dom: DOM API xml.dom.minidom: DOM API的极简化实现 xml.dom.pulldom: 'pull解析器',从xml流中pull事件,然后处理,与SAX一样采用事件驱动模型,但pull解析器需使用者明确xml流中pull事件,对时间进行遍历处理,直到结束或错误。 xml.sax: SAX API xml.parser.expat: expat解析器的底层API接口。类似SAX,但只适合expat库。 xml.etree.ElementTree:轻量级、Pythonic的API.(首选)ElementTree(ET)解析XML ET提供两个对象: ElementTree将整个文档转化为树(xml文档交互) Element则代表树上节点(单个xml元素及其子元素) 创建xml示例文件test.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student no="2009081097">
<name>Hongten</name>
<gender>M</gender>
<age>20</age>
<score subject="math">97</score>
<score subject="chinese">90</score>
</student>
</students>1.xml解析文件导入
#ET模块导入
>>> import xml.etree.ElementTree as ET
#xml文件导入
>>> tree = ET.parse('/root/test.xml')2.解析根元素
#根节点获取
>>> root = tree.getroot()
#根元素解析
>>> root = tree.getroot()
>>> print('root.tag=',root.tag)
root.tag= students
>>> print('root.attrib=',root.attrib)
root.attrib= {}3.解析根的儿子
>>> for child in root:
... print(child.tag)
... print(child.attrib) #字典
...
student
{'no': '2009081097'}4.索引解析根的子孙
>>> print(root[0][0].tag)
name
>>> print(root[0][0].text)
Hongten
>>> print(root[0][4].tag)
score
>>> print(root[0][4].attrib)
{'subject': 'chinese'}
>>> print(root[0][4].text)
905.迭代器遍历解析出指定的元素
>>> for student in root.iter(tag='student'):
... print(student.attrib)
...
{'no': '2009081097'}6.其他解析
# element.findall()解析出指定element的所有儿子
# element.find()解析出指定element的第一个儿子
# element.get()解析出指定element的attrib的key对应值
>>> for student in root.findall('student'):
... score=student.find('score')
... print(score.tag,score.attrib,score.text)
... print(score.get('subject'))
...
score {'subject': 'math'} 97
mathSAX解析XML SAX是基于事件驱动的API SAX解析xml文档分:解析器和事件处理器 解析器:负责读取xml文档并向时间处理器发送事件。 事件处理器:负责对事件做出响应,对传递的xml数据进行处理。 1.大型文件处理; 2.需文件部分内容; 3.想建立自己的对象模型。xml.sax parser 创建一个SAX解析器并解析xml文档
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
xmlfile xml 文件名
contenthandler 必须是一个ContentHandler的对象
errorhandler 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象make_parser 创建一个新的解析器对象并返回
xml.sax.make_parser( [parser_list] )
parser_list 可选参数,解析器列表parseString 创建一个XML解析器并解析xml字符串
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
xmlstring xml字符串
contenthandler 必须是一个ContentHandler的对象
errorhandler 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象xml.sax.handler ContentHandler
characters(content)
调用时机:
从行开始,遇到标签之前,存在字符,content的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
startDocument()
文档启动的时候调用。
endDocument()
解析器到达文档结尾时调用。
startElement(name, attrs)
遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
endElement(name)
遇到XML结束标签时调用。实例文档movies.xml
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<year>2003</year>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<year>1989</year>
<description>A schientific fiction</description>
</movie>
</collection>xml解析脚本
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import xml.sax
class MovieHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData=''
self.type=''
self.year=''
self.description=''
#元素开始事件处理
def startElement(self,tag,attributes):
self.CurrentData=tag
if tag=='movie':
title=attributes['title']
print('Title:',title)
#元素结束事件处理
def endElement(self,tag):
if self.CurrentData=='type':
print('Type:',self.type)
elif self.CurrentData=='year':
print('Year:',self.year)
elif self.CurrentData=='description':
print('Description:',self.description)
self.CurrentData=''
#内容事件处理
def characters(self,content):
if self.CurrentData=='type':
self.type=content
elif self.CurrentData=='year':
self.year=content
elif self.CurrentData=='description':
self.description=content
if __name__=='__main__':
#重写ContextHandler
Handler=MovieHandler()
#创建一个xmlreader
parser=xml.sax.make_parser()#setFeature设置解析器功能xml.sax.handler.feature_namespaces是url路径变量 #没有也能正常解析parser.setFeature(xml.sax.handler.feature_namespaces,0) #关联sax处理器与ContentHandler实例适合内部的start end 内容事件 方法对应parser.setContentHandler(Handler)
parser.parse('movies.xml')结果:
Title: Enemy Behind
Type: War, Thriller
Year: 2003
Description: Talk about a US-Japan war
Title: Transformers
Type: Anime, Science Fiction
Year: 1989
Description: A schientific fiction学习:http://www.runoob.com/python3/python3-xml-processing.html http://www.liaoxuefeng.com/
相关文章推荐
- Python解析XML文件
- Python使用XPATH解析特定结构XML文件速度提升方法
- python对XML的解析(简略分析)
- Python 解析XML
- Python高级编程—————8、Python XML解析
- python解析AndroidManifest.xml文件
- Python解析生成XML-ElementTree VS minidom
- 用 ElementTree 在 Python 中解析 XML
- python对XML的解析
- python对XML的解析
- Python XML解析
- python 解析xml,并修改,插入标签。以及出现ns0的问题,和缩进问题。
- python基础-ElementTree、minidom解析xml
- Python基础教程(十一):多线程、XML解析
- 用Python解析XML文件
- Python中将字典转换为XML以及相关的命名空间解析
- 简单介绍使用Python解析并修改XML文档的方法
- python之xml解析 SAX解析及元素树解析
- python xml解析
- python文件处理:解析.xml文件