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

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)
90
   5.迭代器遍历解析出指定的元素
>>> 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
math
   SAX解析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