将XML和Python 结合起来

      from xml.sax.saxext import *
      parser = XMLParserFactory.make_parser()
包:SAX 以上,我们已提到 SAX 会自动选择要使用的语法分析器;但 SAX 是什么?一个较好的答案是:“SAX(XML 的简单 API)是 XML 语法分析器的公用语法分析器接口。它允许应用程序作者编写使用 XML 语法分析器的应用程序,但是它却独立于所使用的语法分析器。(将它看作 XML 的 JDBC。)”-- Lars Marius Garshol, SAX for PythonSAX -- 如同它提供的语法分析器模块的 API -- 基本上是一个 XML 文档的顺序处理器。使用它的方法与 [xmllib] 示例极其相似,但更加抽象。定义语法分析器类,应用程序员将定义一个 'handler' 类,该类将注册所使用的语法分析器。必须定义四个 SAX 接口(每个接口都有几个方法):DocumentHandler、DTDHandler、EntityResolver 和 ErrorHandler。已提供了所有这些接口的基类,但大多数情况下,最简单的方法是继承 'HandlerBase',因为这个类继承了所有四个接口。可以不用考虑想要做什么。某些代码将帮助解释这一点;该样本执行与 [xmllib] 示例相同的任务。尝试 SAX 的样本代码      #--------------------- try_sax.py ----------------------#
      import string
      from xml.sax import saxlib, saxexts

      class QuotationHandler(saxlib.HandlerBase):
          """Crude sax extractor for quotations.dtd 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)'
                  self.thisquote = ''
                  self.in_quote = 0
              else:
                  self.thisquote = self.thisquote + '}'

          def characters(self, ch, start, length):
              if self.in_quote:
                  self.thisquote = self.thisquote + ch[start:start+length]

      if __name__ == '__main__':
          parser  = saxexts.XMLParserFactory.make_parser()
          handler = QuotationHandler()
          parser.setDocumentHandler(handler)
          parser.parseFile(open("sample.xml"))
          parser.close() 与 [xmllib] 相比,关于示例要注意两件小事:'parseFile()'/'parse()' 方法处理整个流/字符串,所以不必为语法分析器创建循环;向 'characters()' 提供了大量数据,自变量会指出数据的大小和位置以及传递的字符串。不要假设变量 'ch' 将以什么形式传送给 'characters()'。包:DOMDOM 是一种 XML 文档的高级树型表示。该模型并非特定于 Python,而是一种普通 XML 模型。Python 的 DOM 包是针对 SAX 构建的,并且包括在 PyXML 发行版中。由于篇幅关系,没有将代码样本加到本文中,但在 XML-SIG 的 "Python/XML HOWTO" 中给出了一个极好的总体描述。“文档对象模型”(DOM) 为 XML 文档指定了树型表示。顶级文档实例是树的根,它只有一个子代,即顶级元素实例;这个元素有表示内容和子元素的子节点,他们也可以有子代。定义的函数允许随意遍历结果树,访问元素和属性值,插入和删除节点,以及将树转换回 XML。DOM 可以用于修改 XML 文档,因为可以创建一棵 DOM 树,通过添加新节点和来回移动子树来修改这棵树,然后生成一个新的 XML 文档作为输出。您也可以自己构造一棵 DOM 树,然后将它转换成 XML;用这种方法生成 XML 输出比仅将 ... 写入文件的方法更灵活。包:Pyxie[pyxie] 模块从 XML-SIG 构建到 PyXML 发行版之上,它为 XML 文档提供了附加的高级接口。[pyxie] 将完成两项基本操作:它将 XML 文档转换成一种更易于进行语法分析的基于行的格式;并且它提供了将 XML 文档当作可操作树处理的方法。[pyxie] 所使用的基于行的 PYX 格式是独立于语言的,其工具适用于几种语言。总之,文档的 PYX 表示与其 XML 表示相比,更易于使用常见的基于行的文本处理工具进行处理,如 grep、sed、awk、bash、Perl,或标准 python 模块,如 [string] 和 [re]。根据结果,从 XML 转换到 PYX 可能节省许多工作。[pyxie] 将 XML 文档当作树处理的概念与 DOM 中的思路相似

共3页 首页 上一页 [1] [2] [3下一页 尾页>
字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z