有关Python 2.0 XML问题全解析


PythonPython 2.0 XML 与一些规则表达式比较”样式通常不能很好地适合对 XML 进行彻底语法分析和处理,Python不仅有处理复杂数据结构的直接方法,还有一系列 XML 相关的模块可以帮助语法分析、处理和生成 XML。

XML-SIG 专门兴趣组)的成员为维护 Python 一系列 XML 工具做了许多工作。与其它 Python 专门兴趣组一样,XML-SIG 要维护邮件发送列表、列表档案、有用的参考大全、文档、标准包和其它资源请参阅本文后的参考资料)。

Python 2.0 开始,Python 在其标准发行版中包括大多数 XML-SIG 项目。最新的 XML-SIG 包可能包含一些 Python 标准发行版中没有的“极端先进”特性,但出于面向绝大多数人的目的

-- 包括本文中的讨论 Python 2.0 XML 支持将是您感兴趣的。幸运的是,早期 Python 版本对 xmllib 的基本支持在 Python 2.0+ 下有了很大进步。目前,Python 用户能正常的选择。

DOM、SAX 和 expat 技术来处理 XML 使用其他编程语言的 XML 开发人员将会意识到这些)。xmllib 是一个非验证的低级语法分析器。应用程序员使用的 xmllib 可以覆盖 XMLParser 类,并提供处理文档元素如特定或类属标记,或字符实体)的方法。

Python 1.5x 到 Python 2.0+ 以来,xmllib 的使用方法并没变化;在绝大多数情况下更好的选择是使用 SAX 技术,它也是种面向流的技术,对语言和开发者来说更为标准。本文中的示例与原来专栏中的相同:包括一个叫做 quotations.dtd 的 DTD 以及这个 DTD 的文档sample.xml 请参阅参考资料,以获取本文中提到的文件的档案)。

以下的代码显示了 sample.xml 中每段引言的前几行,并生成了非常简单的未知标记和实体的 ASCII 指示符。经过分析的文本作为连续流来处理,所使用的任何累加器都由程序员负责如标记中的字符串 (#PCDATA),或所遇到的标记的列表或词典)。

  1. classQuotationHandler(ContentHandler):  
  2.     """Crude extractor for quotations.dtd compliant XML document"""  
  3.     def__init__(self):  
  4.         self.in_quote = 0 
  5.         self.thisquote = '' 
  6.     defstartDocument(self):  
  7.         print '--- Begin Document ---'  
  8.     defstartElement(self, name, attrs):  
  9.         if name == 'quotation':  
  10.             print 'QUOTATION:'  
  11.             self.in_quote = 1 
  12.         else:  
  13.             selfself.thisquote = self.thisquote + '{'  
  14.     defendElement(self, name):  
  15.         if name == 'quotation':  
  16.             print string.join(string.split(self.thisquote[:230]))+'...',  
  17.             print '('+str(len(self.thisquote))+' bytes)'  
  18.             self.thisquote = '' 
  19.             self.in_quote = 0 
  20.         else: 

您可能需要展望标准 XML 支持的未来的原因是,在进行语法分析的同时需要进行验证。不幸的是,标准 Python 2.0 XML 包并不包括验证型语法分析器。xmlproc 是 python 原有的语法分析器,它执行几乎完整的验证。如果需要验证型语法分析器, xmlproc 是 Python 2.0 XML 当前唯一的选择。而且,xmlproc 提供其它语法分析器所不具备的各种高级和测试接口。

您可以直接导入 xml.parsers.expat。如果这样做,您就能获得 SAX 界面并不提供的一些特殊技巧。这样,xml.parsers.expat 与 SAX 相比有些“低级”。但 SAX 技术非常标准,对面向流的处理也非常好;

大多数情况下 SAX 的级别正合适。通常情况下,由于 make_parser() 函数已经能获得 expat 提供的性能,因此纯速度的差异很小,DOM 可以用于修改 XML 文档,因为可以创建一棵 DOM 树。

通过添加新节点和来回移动子树来修改这棵树,然后生成一个新的 XML 文档作为输出。您也可以自己构造一棵 DOM 树,然后将它转换成 XML;用这种方法生成 XML 输出比仅将 <tag1>...</tag1> 写入文件的方法更灵活。

  1. 如何使Python嵌入C++应用程序?
  2. 深入探讨Ruby与Python语法比较
  3. Python学习资料介绍分享
  4. Python学习经验谈:版本、IDE选择及编码解决方案
  5. 浅析Python的GIL和线程安全

相关内容

    暂无相关文章

评论关闭