7-29<X10>kpg.xml 脚本和流
- “接收……作为参数”一律改为“接受……作为参数”
本章标题:Scrips 和 Streams
脚本和流
抽象输入源
Para 1:Python 的最强大力量之一是它的动态绑定,并且动态绑定最强大的用法之一是类文件(file-like)对象。BR
Python 的最强大力量之一是它的动态绑定,而动态绑定最强大的用法之一是类文件(file-like)对象。
例10.1上, Para -2:只要你将一个类文件对象传递给函数,函数只是调用对象的 read 方法,函数可以处理任何类型的输入源,而不需要处理每种类型的特定代码。BR
只要你将一个类文件对象传递给函数,函数只是调用对象的 read 方法,就可以处理任何类型的输入源,而不需要为处理每种类型分别编码。
例10.1上, Para -1:你可能纳闷过这和 XML 处理有什么关系,……
你可能会纳闷,……
e10.1, (3):确保处理完成
文件后调用 close 方法。
e10.2up:哦,所有这些看上去象是在浪费大量的时间。毕竟,你已经看过 minidom.parse 可以只接收文件名,并自动执行所有打开文件和关闭无用文件的行为。不错,如果你知道正要解析的是一个本地文件,你可以传递文件名而且 minidom.parse 可以足够聪明的做正确的事情™,这一切都不会有问题。但是请注意,使用类文件分析直接从Internet上来的 XML 文档是多么相似和容易的事情!BR
哦,所有这些看上去像是在浪费大量的时间。毕竟,你已经看到,minidom.parse 可以只接收文件名,并自动执行所有打开文件和关闭无用文件的行为。不错,如果你知道正要解析的是一个本地文件,你可以传递文件名而且 minidom.parse 可以足够聪明地做正确的事情(Do The Right Thing™),这一切都不会有问题。但是请注意,使用类文件,会使分析直接从 Internet 上来的 XML 文档变得多么相似和容易!BR
我就纳闷了,怎么“做正确的事情”也成了 trademark。顺便加了个注释
这是一部著名的电影。——译注
e10.2, (1):
正如在前一章中所看到的,……
e10.2, (4):By the way, this URL is real, and it really is XML. It's an XML representation of the current headlines on Slashdot, a technical news and gossip site.BR 顺便提一句,这个 URL 是真实的,它真的是一个 XML。它是Slashdot站点(这是一个技术新闻和随笔站点)上当前标题的 XML 表示。BR
顺便提一句,这个 URL 是真实的,它真的是一个 XML。它是 Slashdot 站点(一个技术新闻和随笔站点)上当前新闻提要的 XML 表示。
e10.3down:OK,所以你可以使用 minidom.parse 函数来解析本地文件和远端 URL,但对于解析字符串,你使用……一个不同的函数。BR
好吧,所以你可以使用 minidom.parse 函数来解析本地文件和远端 URL,但对于解析字符串,你使用……另一个函数。
e10.4up:如果有一个方法可以把字符串转换成类文件对象,那么你可以只把
这个对象传递给 minidom.parse 就可以了。
只要
e10.4, (1):StringIO 模块只包含了单个
类,也叫 StringIO,它允许你将一个字符串转换为一个类文件对象。这个
StringIO 类在创建实例的时候接收字符串作为参数。
一个
e10.4, (4):任何时候,read 都将返回字符串的未读剩余
部分。
e10.5, (1):……它将调用对象的 read 方法并高兴的开始解析,绝不会知道它的输入源源
自一个硬编码的字符串。
e10.5down:那么现在你知道了如何使用单个
函数,minidom.parse,来解析一个保存在 web 页面上、本地文件中或硬编码字符串中的 XML 文档。
同一个
e10.6, (1):……source 是某种类型的字符串;它可能是一个 URL(例如 'http://slashdot.org/slashdot.rdf' ),一个本地文件的完整或者部分路径名(例如 'binary.xml'),或者是一个包含了需要解析
XML 数据的字符串。待解析
e10.6, (2):This is actually elegant in the sense that, if urllib ever supports new types of URLs in the future, you will also support them without recoding.BR 这里通过强制方式进行:尝试把它当作一个 URL 打开并静静地忽略打开非 URL 引起的错误。感觉上
这样做非常好,因为如果 urllib 将来支持更多的 URL 类型,不用重新编码就可以支持它们。
e10.6, (3):再一次,你不用做任何特别的事来检查 source 是否是一个有效的文件名(总之在不同的平台上,判断文件名有效性的规则变化很大,那么不管怎样做都可能会判断错)。BR
再一次,你不用做任何特别的事来检查 source 是否是一个有效的文件名(在不同的平台上,判断文件名有效性的规则变化很大,因此不管怎样做都可能会判断错)。
e10.6, (4):到这里,你需要假设 source 是一个其中有硬编码数据的字符串(因为没有什么可以判断的了),所以你可以使用 StringIO 从中创建一个类文件对象并将它返回。(实际上,由于使用了 str 函数,所以 source 没有必要一定是字符串;它可以是任何对象,你可以使用它的字符串表示形式,通过它的定义的 __str__ 特殊方法。)
到这里,你需要假设 source 是一个其中有硬编码数据的字符串(因为没有别的可以判断的了),所以你可以使用 StringIO 从中创建一个类文件对象并将它返回。(实际上,由于使用了 str 函数,所以 source 没有必要一定是字符串;它可以是任何对象,你可以使用它的字符串表示形式,只要定义了它的 __str__ 专用方法。)
e10.6down:……构造一个函数,接收一个指向 XML 文档的 source,而且无需知道这个 source 的含义,并
解析它。
然后
标准输入、输出和错误
查询缓冲节点
查找节点的直接子节点
根据节点类型创建不同的处理器
处理命令行参数
全部放在一起