Python XML操作处理
什么是XML ?
可扩展标记语言(XML)是一个很象HTML或SGML的标记语言。这是建议由万维网联盟作为一个开放的标准.
XML是一种便携式的,开源的语言,它允许程序员开发可以由其他应用程序读取的应用,无论操作系统和/或发展语言.
XML是非常有用的,为保持跟踪小到中量的数据,而不需要一个基于SQL的的支柱.
XML分析器体系结构和API:
Python标准库提供了一个最小的接口,但有用的一套使用XML.
两个最基本和最广泛使用的API,XML数据是SAX和DOM接口.
-
Simple API for XML (SAX) : 在这里你感兴趣的事件注册回调,然后让通过的文件进行的解析器。当您的文件是大型或你有内存限制,这是非常有用的,它解析的文件,因为它从磁盘读取整个文件没有存储在内存中.
-
Document Object Model (DOM) API : 这是万维网联盟的建议,其中将整个文件读入内存,并存储在一个层次(树状)的形式表示XML文档的所有功能.
SAX的,显然不能作为DOM快速处理的信息可以与大文件时的工作。另一方面,使用DOM完全可以真的操作你的资源,特别是如果使用大量小文件.
SAX是只读,而DOM允许修改XML文件。由于这两种不同的API的字面相辅相成,没有任何理由,你为什么不能使用大型项目.
为我们所有的XML代码例子,让我们用一个简单的XML文件movies.xml作为输入:
War, ThrillerDVD2003PG10Talk about a US-Japan warAnime, Science FictionDVD1989R8A schientific fictionAnime, ActionDVD4PG10Vash the Stampede!ComedyVHSPG2Viewable boredom
用SAX API的解析XML:
SAX是一种事件驱动的解析XML的标准接口。使用SAX解析XML的一般要求你通过继承xml.sax.ContentHandler创建自己的ContentHandler,.
您的ContentHandler的处理你的味道,特别是标签和属性的XML(S)。一个ContentHandler对象提供的方法来处理各种解析事件。其拥有的解析器调用ContentHandler方法,因为它解析XML文件.
startDocument和endDocument的方法被称为在开始和结束的XML文件。通过参数文本的方法字符(文本)通过XML文件中的字符数据.
ContentHandler是在每个元素的开始和结束。如果分析器不能在命名空间的模式,方法的startElement(标签,属性)和endElement(标签)被称为否则,相应方法startElementNS和endElementNS的被称为。在这里,标签元素的标签,和属性是一个属性对象.
在这里,还有其他重要的方法来了解,然后再进行:
make_parser 方法:
下面的方法创建一个新的解析器对象,并返回它。创建解析器对象将是第一个解析器类型系统发现.
xml.sax.make_parser( [parser_list] )
下面是详细的参数:
-
parser_list: 可选的参数组成的解析器使用,都必须实施make_parser方法.
parse 方法:
下面的方法创建一个SAX解析器和使用它来解析文档.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
下面是详细的参数:
-
xmlfile: 这是读取XML文件的名称.
-
contenthandler: 这必须是一个ContentHandler对象.
-
errorhandler: 如果指定的ErrorHandler必须是一个SAX ErrorHandler对象.
parseString 方法:
还有一个方法创建一个SAX解析器来解析指定的XML字符串.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
下面是详细的参数:
-
xmlstring: 这是读取XML字符串的名称.
-
contenthandler: 这必须是一个ContentHandler对象.
-
errorhandler: 如果指定的ErrorHandler必须是一个SAX ErrorHandler对象.
例子:
#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print "*****Movie*****"
title = attributes["title"]
print "Title:", title
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print "Type:", self.type
elif self.CurrentData == "format":
print "Format:", self.format
elif self.CurrentData == "year":
print "Year:", self.year
elif self.CurrentData == "rating":
print "Rating:", self.rating
elif self.CurrentData == "stars":
print "Stars:", self.stars
elif self.CurrentData == "description":
print "Description:", self.description
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = 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 API解析:
文档对象模型,或“DOM中,”是一个由万维网联盟(W3C)的跨语言的API,用于访问和修改XML文档.
DOM是随机存取的应用极为有用。 SAX只允许你的时间在一个文件的位的看法。如果你正在寻找一个SAX元素,你有没有到另一个接入.
这是最简单的方法快速加载一个XML文件,并创建一个minidom使用xml.dom中的模块对象。的minidom对象提供了一个简单的解析器的方法,很快就会从XML文件创建一个DOM树.
示例短语调用parse( file [,parser] )函数 minidom对象来解析XML文件的文件指定到一个DOM树对象.
#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("text.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print "*****Movie*****"
if movie.hasAttribute("title"):
print "Title: %s" % movie.getAttribute("title")
type = movie.getElementsByTagName('type')[0]
print "Type: %s" % type.childNodes[0].data
format = movie.getElementsByTagName('format')[0]
print "Format: %s" % format.childNodes[0].data
rating = movie.getElementsByTagName('rating')[0]
print "Rating: %s" % rating.childNodes[0].data
description = 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.
本文详细介绍了Python中XML操作处理的相关知识,包括XML的基本概念、Python标准库中的XML API,以及SAX和DOM两种解析方式的区别和应用。通过实际代码示例,展示了如何使用SAX和DOM API解析XML文件。
31万+

被折叠的 条评论
为什么被折叠?



