WEB开发网
开发学院软件开发Python 将 XML 文档作为对象的“Python 化”处理 (II) 阅读

将 XML 文档作为对象的“Python 化”处理 (II)

 2007-03-30 12:26:26 来源:WEB开发网   
核心提示: <misc-info>One of the <ital>most</ital> talentedactresses on TV.</misc-info>xml_objectify 将一个称为 ._XML 的特殊属性添加到看起来包含标记字符数据
<misc-info>One of the <ital>most</ital> talented
actresses on TV.</misc-info>

xml_objectify 将一个称为 ._XML 的特殊属性添加到看起来包含标记字符数据的对象/标记。这个属性在标记中包含文字XML。例如,如果给定的嵌套对象有 ._XML 属性, pyobj_printer() 函数显示这个文字 XML而不是递归属性。不过,仍然执行标准递归子标记-对象的创建,因此可以知道哪些属性和结构最适当。

本机 Python 对象只包含根文档

许多 XML文档都伴随着标记和字符数据内容提供处理指令和/或注释。不过,由 XML_Objectify 对象的 .make_instance() 方法创建的本机 Python 对象只包含文档根标记的内容。而且将忽略 XML注释;只表示标记属性和字符数据。

在上面的 从 XML 文档创建 Python对象示例中,如果保留原始的 XML_Objectify 对象( xml_obj ),可以访问它的 .processing_instruction 属性,甚至可以访问它的 ._dom 属性来查看本机 Python 对象忽略了什么。

属性类型简化

所有 XML 属性都转换成字符串类型的 Python 对象属性。当前,Python不表示属性的 XML枚举或数字类型。在以后的版本中可能加入这样的能力,但这些通常需要DTD,而 xml_objectify 不具有 DTD。

子标记属性

XML 子标记 或者由对象类型的 Python属性表示, 或者由这种对象的列表表示,这要取决于是一个还是几个相同类型的子标记。即由包含相同类型多个子标记的特定标记决定。例如,在上面第一个 address.xml 示例中,一个人的联系信息可能包括 1个家庭电话,而另一个人的联系信息可能包括 0 个或几个。相应地,一些 contact_info 对象没有 .home_phone 属性,一些具有包含一个 home_phone 对象的 .home_phone 属性,还有一些具有包含许多 home_phone 对象的 .home_phone 属性。尽管使用 DTD 的情况下有可能施加更多法则,但我认为,Python应用程序需要这种动态能力。

Python 名称空间限制

要知道 Python 名称空间比 XML名称空间小。因此,有时要修改标记或属性的 XML名称。 xml_objectify 将破折号、冒号和镑值/散列标志转换成下划线。该模块不处理任何其它名称空间冲突。例如,如果XML 文档有标记 <spam-eggs> 、 <spam_eggs> 、 <spam:eggs> 和 <spam#eggs> ,那么 xml_objectify 所创建的 Python 对象就不能正确表示 XML文档。在大多数情况下,这不是问题,因为人们不希望得到的 XML文档具有这些冲突的标记。

xml_objectify的前景如何?

目前,还不能将本机 Python 对象转回带有与读取的 XML 文档相同结构的XML 文档。因为 xml_objectify 故意舍去 XML文档中有关顺序的信息来产生更易理解的 Python对象,所以可能发生问题。Python 属性没有任何预先确定的顺序,但需要XML 标记和属性以特定的顺序排列。即使不 需要XML标记来以特定的顺序出现,顺序在语义上还是很重要。(请注意在重复公共子标记的情况下,Python列表维护顺序。)为了转换回XML,我们需要或者选择任意顺序,或者保留本机 Python对象中的顺序信息,使得它看上去不太象 Python。

重新构造 Python 对象中已删除的信息的一个选择是在转换回 XML时强制 DTD。即使我使用这一做法的,但在如何处理 Python运行时添加、删除或修改的属性时,问题仍然存在。修改 Python对象可能导致有些部分不符合原始 XML 文档的DTD。不过,如果用户有特定需要,我会将这些能力添加到 xml_objectify 。

上一页  1 2 3 4 5 

Tags:XML 文档 作为

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接