常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。
python有三种方法解析XML,SAX,DOM,以及ElementTree:
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
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>
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