测试用例:
测试结果:
转贴请注明出处http://blog.csdn.net/porcupinefinal
网上关于xml文件解析的例子多如牛毛,用python解析的也不少,在百度输入python xml就会出来不少结果。我也是从这些例子和文章中学的,所以会有类似的地方,当然我也会加入自己的一些体会。
《dive into python》第五章对这一部分有较详尽的讲解,如果你不喜欢看英文的话,可到这个网站:http://www.chinesepython.org/pythonfoundry/limodoupydoc/dive/html/toc.html查阅。
下边开始我们的xml解析之旅:
处理xml有两种方法:
FIRST:SAX—Simple API for XML。它的工作方式是,一次读出一点XML,对发现的每个元素调用一个方法。SAX是 XML 语法分析器的公用语法分析器接口。它允许应用程序作者编写使用 XML 语法分析器的应用程序,但是它却独立于所使用的语法分析器。(将它看作 XML 的 JDBC。)(Lars Marius Garshol,SAX for Python)
功能:基本上是一个 XML 文档的顺序处理器。应用程序员将定义一个 handler 类,而不是语法分析器类,该 handler 类能注册到任何所使用的语法分析器中。必须定义 4 个 SAX 接口(每个接口都有几个方法):DocumentHandler、DTDHandler、EntityResolver 和 ErrorHandler。创建语法分析器除非被覆盖,否则它还连接默认接口。
SECOND:DOM—Document Object Model。它的工作方式是,一次读出整个XML文档,通过将本地的Python类链接到一个树型结构中,生成文档的一个内部表示。
这篇文章里我主要用的是SAX这种方法(在dive into python一书中用的是DOM这种方式,我将在下一篇文章python与xml之更新篇中用这种方法举例如何增加、更新及删除xml文件中的某个节点。)我之所以选择这种方法是因为关于用DOM来解析xml的文章实在太多,没有什么从新写的必要,网上也有人说用DOM解析较大的xml文件时效率较低的问题(自己没有测试过,有人说是5M的文件要解析20分钟。。。是够慢的),所以我选择了用SAX来解析xml。
示例:(该示例转载自ibm上可爱的python系列)
import string
import xml.sax
from xml.sax.handler import *
classQuotationHandler(ContentHandler):
"""Crude extractor for quotations.dtd compliant XML document"""
def __init__(self):
self.in_quote = 0
self.thisquote = ''
def startDocument(self):
print '--- Begin Document ---'
def startElement(self, name, attrs):
if name == 'quotation':
print 'QUOTATION:'
self.in_quote = 1
else:
self.thisquote = self.thisquote + '{'
def endElement(self, name):
if name == 'quotation':
print string.join(string.split(self.thisquote[:230]))+'...',
print '('+str(len(self.thisquote))+' bytes)/n'
self.thisquote = ''
self.in_quote = 0
else:
self.thisquote = self.thisquote + '}'
def characters(self, ch):
if self.in_quote:
self.thisquote = self.thisquote + ch
if __name__ == '__main__':
parser = xml.sax.make_parser()
handler = QuotationHandler()
parser.setContentHandler(handler)
parser.parse("sample.xml")
要点:
1、 注意黑体加粗部分,首先继承ContentHandler,构造自己的handler;
2、 剩下的startElement、endElement、characters三个接口必须实现,startElement和endElement主要用于解析形如
3、 形如
4、 parse() 方法处理整个流或字符串,所以不必为语法分析器创建循环;
5、 parse() 同样能灵活地接收一个文件名、一个文件对象,或是众多的类文件对象(一些具有 .read() 方式)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/porcupinefinal/archive/2006/03/19/629383.aspx
///////////////////////////////////////////////////////////
首先:xml文件(tree.xml)内容如下:
http://www.baidu.com/
http://www.baidu.com/
http://www.baidu.com/
http://www.baidu.com/
http://www.baidu.com/
//////////////////////////////////////////////////////
然后:javascript函数实现:(文件名称:tree.htm)