Python之解析XML

来源:互联网 发布:淘宝店面如何装修 编辑:程序博客网 时间:2024/05/04 08:40

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

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(元素树)

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

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。


看例子,我创建一个ipfile.xml文件,内容:

<plist version="1.0">    <dict>        <key>ip</key>        <string>112.74.66.128</string>    </dict></plist>

解析代码如下,首先创建一个自己的handler类:

from xml.dom.minidom import parseimport xml.dom.minidomclass MyXMLHandler(xml.sax.ContentHandler): //继承xml.sax的handler   def __init__(self):      self.key = ""      self.ipKey = ""      self.name = ""   def startElement(self, name, attrs):      self.name = name #获取属性      if self.name == "plist":         print "plist: "   def characters(self, content):      if self.name == "key": #获取内容字段         self.key = content      elif self.name == "string":         self.ipKey = content   def endElement(self, name):      if self.name == "key": #最后结束一个标签<span style="font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif;">搜索</span>         print "key: ", self.key      elif self.name == "string":          print "string: ", self.ipKey      self.name = ""


接下来写执行指令:

   #创建解释器,利用sax解析   # parser = xml.sax.make_parser()   # #   # parser.setFeature(xml.sax.handler.feature_namespaces, 0)   #   # #创建XML句柄   # MyH = MyXMLHandler();   #   # #设置内容句柄   # parser.setContentHandler(MyH)   #   # #解析XML文件   # parser.parse("ipfile.xml")   #利用Dom解析   DOMTREE = xml.dom.minidom.parse("ipfile.xml")   collection = DOMTREE.documentElement   dictS = collection.getElementsByTagName("dict")   for dict in dictS:      key = dict.getElementsByTagName('key')[0]      print "Type: %s" % key.childNodes[0].data      ipkey = dict.getElementsByTagName('string')[0]      print "Type: %s" % ipkey.childNodes[0].data


0 0
原创粉丝点击