常见的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 parse
import xml.dom.minidom
class 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