python解析xml降低内存

python解析xml降低内存,第1张

1. 使用ElementTree模块,它是Python标准库中提供的一个XML解析模块,它使用简单,非常容易使用,可以降低内存占用。

2. 使用lxml模块,它是一个高性能的XML和HTML解析器,可以有效的降低内存占用。

3. 使用iterparse()函数,它可以遍历XML文档,可以降低内存占用。

4. 使用xml.sax模块,它是一个基于事件驱动的XML解析器,可以有效的降低内存占用。

SAX是一种基于事件驱动的API,利用SAX解析XML牵扯到两个部分,解析器和事件处理器。其中解析器负责读取XML文档,并向事件处理器发送事件;事件处理器负责做出响应,对处理的XML数据进行处理。

常用情况:

1.对大型文件进行处理

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

3.想建立自己的对象模型

文档启动的时候调用

文档解析结束后调用

遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典,例如<user name='MoonMonster'>,那么便可使用attrs['name']来获取name的值。

遇到XML结束标签时调用,name是结束标签的名称

包含在标签中的值,content就是被包含的值

如果只是需要从文档中把所有的数据都读取出来,那么直接从character()函数中保存content数据即可,然后在endElement()函数中存储。需要注意的是,这种写法需要将没有直接内容的标签排除掉,例如movie标签,不然会出现没有数据的标签出现数据的情况。还有一点需要注意,如果标签中的数据换行了,会带来很多意料之外的情况,像下面这种。

或者参照网上其他人的写法:

在这个例子中,使用了self.CurrentData来保存当前标签,但有一个坑的地方是,在endElement函数中,无法获取到像movie这种标签的结束标签。

python有三种方法解析XML,分别是SAX,DOM,以及ElementTree:

SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

DOM模型将XML数据在内存中解析成一个树,通过对树的 *** 作来 *** 作XML。

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

Python 解析XML实例:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

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 = ""

   # 元素开始事件处理

   def startElement(self, tag, attributes):

      self.CurrentData = tag

      if tag == "movie":

         print "*****Movie*****"

         title = attributes["title"]

         print "Title:", title

   # 元素结束事件处理

   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 = ""

   # 内容事件处理

   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__"):

   

   # 创建一个 XMLReader

   parser = xml.sax.make_parser()

   # turn off namepsaces

   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # 重写 ContextHandler

   Handler = MovieHandler()

   parser.setContentHandler( Handler )

   

   parser.parse("movies.xml")


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12032348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存