常见的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