python 菜鸟教程 xml-Python XML 解析

本文介绍了Python中处理大型XML文件的两种方法:SAX和DOM。SAX是事件驱动的,适用于处理大文件,而DOM将整个XML加载到内存中,适合小文件。文中给出了SAX解析器的使用示例,包括ContentHandler的方法如startElement、endElement和characters。同时,也展示了DOM解析器如何通过xml.dom.minidom读取和打印XML文件的详细信息。
摘要由CSDN通过智能技术生成

1、对大型文件进行处理;

2、只需要文件的部分内容,或者只需从文件中得到特定信息。

3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

ContentHandler类方法介绍

characters(content)方法

调用时机:

从行开始,遇到标签之前,存在字符,content 的值为这些字符串。

从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。

从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。

标签可以是开始标签,也可以是结束标签。

startDocument() 方法

文档启动的时候调用。

endDocument() 方法

解析器到达文档结尾时调用。

startElement(name, attrs)方法

遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。

endElement(name) 方法

遇到XML结束标签时调用。

make_parser方法

以下方法创建一个新的解析器对象并返回。

xml.sax.make_parser( [parser_list] )

参数说明:

parser_list -

可选参数,解析器列表

parser方法

以下方法创建一个 SAX 解析器并解析xml文档:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

参数说明:

xmlfile -

xml文件名

contenthandler -

必须是一个ContentHandler的对象

errorhandler -

如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象

parseString方法

parseString方法创建一个XML解析器并解析xml字符串:

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

参数说明:

xmlstring -

xml字符串

contenthandler -

必须是一个ContentHandler的对象

errorhandler -

如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象

Python 解析XML实例

实例

#!/usr/bin/python# -*- coding: UTF-8 -*-importxml.saxclassMovieHandler(xml.sax.ContentHandler):def__init__(self):self.CurrentData=""self.type=""self.format=""self.year=""self.rating=""self.stars=""self.description=""# 元素开始事件处理defstartElement(self,tag,attributes):self.CurrentData=tagiftag=="movie":print"*****Movie*****"title=attributes["title"]print"Title:",title# 元素结束事件处理defendElement(self,tag):ifself.CurrentData=="type":print"Type:",self.typeelifself.CurrentData=="format":print"Format:",self.formatelifself.CurrentData=="year":print"Year:",self.yearelifself.CurrentData=="rating":print"Rating:",self.ratingelifself.CurrentData=="stars":print"Stars:",self.starselifself.CurrentData=="description":print"Description:",self.descriptionself.CurrentData=""# 内容事件处理defcharacters(self,content):ifself.CurrentData=="type":self.type=contentelifself.CurrentData=="format":self.format=contentelifself.CurrentData=="year":self.year=contentelifself.CurrentData=="rating":self.rating=contentelifself.CurrentData=="stars":self.stars=contentelifself.CurrentData=="description":self.description=contentif(__name__=="__main__"):# 创建一个 XMLReaderparser=xml.sax.make_parser()# turn off namepsacesparser.setFeature(xml.sax.handler.feature_namespaces,0)# 重写 ContextHandlerHandler=MovieHandler()parser.setContentHandler(Handler)parser.parse("movies.xml")

以上代码执行结果如下:

*****Movie*****

Title: Enemy Behind

Type: War, Thriller

Format: DVD

Year: 2003

Rating: PG

Stars: 10

Description: Talk about a US-Japan war

*****Movie*****

Title: Transformers

Type: Anime, Science Fiction

Format: DVD

Year: 1989

Rating: R

Stars: 8

Description: A schientific fiction

*****Movie*****

Title: Trigun

Type: Anime, Action

Format: DVD

Rating: PG

Stars: 10

Description: Vash the Stampede!

*****Movie*****

Title: Ishtar

Type: Comedy

Format: VHS

Rating: PG

Stars: 2

Description: Viewable boredom

完整的 SAX API 文档请查阅Python SAX APIs

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

python中用xml.dom.minidom来解析xml文件,实例如下:

实例

#!/usr/bin/python# -*- coding: UTF-8 -*-fromxml.dom.minidomimportparseimportxml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree=xml.dom.minidom.parse("movies.xml")collection=DOMTree.documentElementifcollection.hasAttribute("shelf"):print"Root element : %s"%collection.getAttribute("shelf")# 在集合中获取所有电影movies=collection.getElementsByTagName("movie")# 打印每部电影的详细信息formovieinmovies:print"*****Movie*****"ifmovie.hasAttribute("title"):print"Title: %s"%movie.getAttribute("title")type=movie.getElementsByTagName('type')[0]print"Type: %s"%type.childNodes[0].dataformat=movie.getElementsByTagName('format')[0]print"Format: %s"%format.childNodes[0].datarating=movie.getElementsByTagName('rating')[0]print"Rating: %s"%rating.childNodes[0].datadescription=movie.getElementsByTagName('description')[0]print"Description: %s"%description.childNodes[0].data

以上程序执行结果如下:

Root element : New Arrivals

*****Movie*****

Title: Enemy Behind

Type: War, Thriller

Format: DVD

Rating: PG

Description: Talk about a US-Japan war

*****Movie*****

Title: Transformers

Type: Anime, Science Fiction

Format: DVD

Rating: R

Description: A schientific fiction

*****Movie*****

Title: Trigun

Type: Anime, Action

Format: DVD

Rating: PG

Description: Vash the Stampede!

*****Movie*****

Title: Ishtar

Type: Comedy

Format: VHS

Rating: PG

Description: Viewable boredom

完整的 DOM API 文档请查阅Python DOM APIs。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值