在 David Mertz 新
![](/icons/72132de.gif)
有关“XML 问题”专栏
![](/icons/72132de.gif)
第 2部分 --也是他对在 XML 和 Python的间创建更加无缝
![](/icons/72132de.gif)
集成而不断进行探求
![](/icons/72132de.gif)
![](/icons/72132yi.gif)
部分 -- 中介绍了 xml_object
![](/icons/72132if.gif)
y 模块
![](/icons/72132dou2.gif)
David 描述了如何使用 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132dou.gif)
以及将该“Python 化”模块用于作为对象
![](/icons/72132de.gif)
XML 文档使用
![](/icons/72132de.gif)
好处
![](/icons/72132dou2.gif)
项目介绍
XML 问题 #1介绍了在 XML 和 Python的间创建更加无缝和自然集成
![](/icons/72132de.gif)
项目
![](/icons/72132dou2.gif)
参考资料部分提供了到其它 developerWorks文章
![](/icons/72132de.gif)
链接
![](/icons/72132dou.gif)
在这些文章中
![](/icons/72132dou.gif)
我讨论了
![](/icons/72132yi.gif)
些常规Python 编程技术和其它有关 XML/Python
![](/icons/72132de.gif)
主题
![](/icons/72132dou2.gif)
获得兼容
![](/icons/72132de.gif)
XML-SIG 更新
XML-SIG 发行版在 beta 版本中更改相当频繁
![](/icons/72132dou2.gif)
这些更改往往影响到 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132de.gif)
功能
![](/icons/72132dou2.gif)
因此
![](/icons/72132dou.gif)
可以从 参考资料中下载已知和 xml_object
![](/icons/72132if.gif)
y 兼容
![](/icons/72132de.gif)
XML-SIG 版本
![](/icons/72132dou2.gif)
当 XML-SIG 发行版正式发行并且/或者当 XML 软件Software包作为正式 Python发行版
![](/icons/72132de.gif)
![](/icons/72132yi.gif)
部分时
![](/icons/72132dou.gif)
当前
![](/icons/72132de.gif)
xml_object
![](/icons/72132if.gif)
y 将进行更新以对正式发行版使用
![](/icons/72132dou2.gif)
有关当前 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132de.gif)
详细信息
![](/icons/72132dou.gif)
请参阅 参考资料
![](/icons/72132yinwei.gif)
在 XML 和 Python 的间存在不对称性
![](/icons/72132dou.gif)
所以该项目 --至少在最初时 -- 包含两个单独
![](/icons/72132de.gif)
模块: xml_pickle 和 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132dou.gif)
前者用于以 XML 表示任意
![](/icons/72132de.gif)
Python对象
![](/icons/72132dou.gif)
后者用于将 XML 文档本机表示为 Python 对象
![](/icons/72132dou2.gif)
本文主要讨论 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132dou2.gif)
在 Python 中
![](/icons/72132dou.gif)
例如 xmllib 、 xml.sax 、 pyxie 和 xml.dom 这样
![](/icons/72132de.gif)
模块和软件Software包提供了处理 XML社区中
![](/icons/72132yi.gif)
些公共 XML文档
![](/icons/72132de.gif)
思路方法
![](/icons/72132dou2.gif)
您可能熟悉应用于其它编程语言
![](/icons/72132de.gif)
类似模块和库
![](/icons/72132dou2.gif)
实际上
![](/icons/72132dou.gif)
许多模块都基于语言中性
![](/icons/72132de.gif)
XML 标准
![](/icons/72132dou.gif)
它们通常实现以 XML 为中心
![](/icons/72132de.gif)
处理文档和对象
![](/icons/72132de.gif)
思路方法
![](/icons/72132dou2.gif)
常规 XML 协议
![](/icons/72132de.gif)
Python实现提供了以区别思路方法进行编程
![](/icons/72132de.gif)
灵活性
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
可以使用如 DOM这样
![](/icons/72132de.gif)
可移植标准
![](/icons/72132dou.gif)
这样
![](/icons/72132dou.gif)
使用
![](/icons/72132yi.gif)
种语言
![](/icons/72132de.gif)
![](/icons/72132chengxu.gif)
员可以方便地对以另
![](/icons/72132yi.gif)
种语言编写
![](/icons/72132de.gif)
面向DOM
![](/icons/72132de.gif)
代码进行操作
![](/icons/72132dou2.gif)
不过
![](/icons/72132dou.gif)
Python
![](/icons/72132chengxu.gif)
员有时可能宁愿以更类似于“正常”Python
![](/icons/72132de.gif)
思路方法进行编码
![](/icons/72132dou2.gif)
在许多情况下
![](/icons/72132dou.gif)
XML 概念性框架看起来似乎更接近于Python
![](/icons/72132dou.gif)
而不是 Python
![](/icons/72132de.gif)
![](/icons/72132yi.gif)
个组成部分
![](/icons/72132dou2.gif)
因此
![](/icons/72132dou.gif)
我开发了
![](/icons/72132yi.gif)
系列用于 XML文档
![](/icons/72132de.gif)
“Python 化”模块
![](/icons/72132dou2.gif)
向前
![](/icons/72132yi.gif)
步:如何使用xml_object
![](/icons/72132if.gif)
y
使用 xml_object
![](/icons/72132if.gif)
y 很简单
![](/icons/72132dou.gif)
而且在模块 doc
![](/icons/72132string.gif)
注释中有详细记载
![](/icons/72132dou2.gif)
让我们快速浏览
![](/icons/72132yi.gif)
下
![](/icons/72132yi.gif)
些样本代码:
从 XML 文档创建 Python对象
from
xml_object
y
import
XML_Object
y
xml_obj = XML_Object
y(
'address.xml')
py_obj = xml_obj.make_instance![](/icons/72132kh.gif)
如您所见
![](/icons/72132dou.gif)
从常规 XML 文档创建本机 Python对象有两个步骤
![](/icons/72132dou2.gif)
首先创建
![](/icons/72132yi.gif)
个类似于 DOM
![](/icons/72132de.gif)
中间工厂对象(即用于创建其它对象
![](/icons/72132de.gif)
对象)
![](/icons/72132dou2.gif)
然后
![](/icons/72132dou.gif)
从 XML_Object
![](/icons/72132if.gif)
y 例子中生成
![](/icons/72132yi.gif)
个或多个 Python对象例子
![](/icons/72132dou2.gif)
请注意
![](/icons/72132dou.gif)
应该使用 xml_pickler 来处理特殊
![](/icons/72132de.gif)
PyObjects.dtd 格式文档
![](/icons/72132dou2.gif)
(请参阅 XML 问题 #1了解有关 xml_pickle
![](/icons/72132de.gif)
信息
![](/icons/72132dou2.gif)
)
也可以在同
![](/icons/72132yi.gif)
行上执行这两步
![](/icons/72132dou2.gif)
例如:
在
![](/icons/72132yi.gif)
行中创建 XML/Python 对象
py_obj = XML_Object
y(
'address.xml').make_instance![](/icons/72132kh.gif)
当然
![](/icons/72132dou.gif)
在后
![](/icons/72132yi.gif)
种情况中
![](/icons/72132dou.gif)
不保留工厂对象来产生更多本机对象
![](/icons/72132dou.gif)
而且也将清除包含它
![](/icons/72132de.gif)
完整DOM 例子
![](/icons/72132de.gif)
._dom 数据成员
![](/icons/72132dou2.gif)
为进行比较
![](/icons/72132dou.gif)
下例显示了使用 Python 创建 DOM 对象有多简单:
从 XML 文档创建 DOM 对象
from xml.dom.utils import FileReader
dom_obj =
FileReader
.readXml(open('address.xml'))
FileReader
![](/icons/72132kh.gif)
.readXml
![](/icons/72132kh.gif)
需要实际
![](/icons/72132de.gif)
文件对象
![](/icons/72132dou.gif)
而 XML_Object
![](/icons/72132if.gif)
y
![](/icons/72132kh.gif)
可以接受文件对象或者普通文件名
![](/icons/72132dou2.gif)
在这两种情况下
![](/icons/72132dou.gif)
创建对象是
![](/icons/72132yi.gif)
个两行
![](/icons/72132de.gif)
操作
![](/icons/72132dou2.gif)
使用 xml_object
![](/icons/72132if.gif)
y 模块和 xml.dom 软件Software包
![](/icons/72132de.gif)
区别的处在于最后得到
![](/icons/72132de.gif)
对象类型
![](/icons/72132dou2.gif)
Python DOM 对象是真正
![](/icons/72132de.gif)
Python 对象
![](/icons/72132dou.gif)
但它
![](/icons/72132de.gif)
属性和思路方法和原始 XML文档
![](/icons/72132de.gif)
数据和结构对应程度并不象 XML_Object
![](/icons/72132if.gif)
y 对象那样接近
![](/icons/72132dou2.gif)
Python DOM 对象
![](/icons/72132de.gif)
属性通常嵌套了 .children 列表
![](/icons/72132dou.gif)
这些列表在语义上并没有什么太大
![](/icons/72132de.gif)
帮助
![](/icons/72132dou2.gif)
要访问样本文档中同
![](/icons/72132yi.gif)
个XML 属性
![](/icons/72132dou.gif)
可以使用 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132de.gif)
第
![](/icons/72132yi.gif)
行
![](/icons/72132dou.gif)
也可以使用DOM
![](/icons/72132de.gif)
以下 4行
![](/icons/72132dou2.gif)
下面显示了这 4行:
使用 [xml.dom] 和 [xml_object
![](/icons/72132if.gif)
y] Python对象
pr![](/icons/72132int.gif)
py_obj.person[1].address.city
pr![](/icons/72132int.gif)
dom_obj.get_childNodes
[1].get_childNodes
[3].
get_childNodes
[3].get_attributes
[
'city'].value
pr![](/icons/72132int.gif)
dom_obj._node.children[1].children[3].children[3].
attributes[
'city'].children[0].value
DOM树是按严格定序
![](/icons/72132de.gif)
节点树组织起来
![](/icons/72132de.gif)
![](/icons/72132dou2.gif)
枚举这些节点并不困难
![](/icons/72132dou.gif)
但要引用其中特定
![](/icons/72132de.gif)
节点就非常麻烦了
![](/icons/72132dou2.gif)
如果有些节点是空白文本和处理指令节点(您几乎不太关心它们)
![](/icons/72132dou.gif)
情况就更糟糕了
![](/icons/72132dou.gif)
因此在节点列表中查找子标记多半要反复试验
![](/icons/72132dou2.gif)
在上例中
![](/icons/72132dou.gif)
访问本机属性(例如 .children )和 DOM 样式
![](/icons/72132de.gif)
思路方法(例如 .get_childNodes
![](/icons/72132kh.gif)
)用在区别
![](/icons/72132de.gif)
pr
![](/icons/72132int.gif)
语句中
![](/icons/72132dou2.gif)
使用这两种思路方法时
![](/icons/72132dou.gif)
要知道引用了 XML文档中哪些数据都很不容易
![](/icons/72132dou2.gif)
相反
![](/icons/72132dou.gif)
上例中第
![](/icons/72132yi.gif)
个 pr
![](/icons/72132int.gif)
语句非常好地文档化了自己
![](/icons/72132dou2.gif)
唯
![](/icons/72132yi.gif)
需要注意
![](/icons/72132de.gif)
![](/icons/72132yi.gif)
个小问题是必须使用 Python
![](/icons/72132de.gif)
基于 0
![](/icons/72132de.gif)
列表索引
![](/icons/72132dou2.gif)
除此以外
![](/icons/72132dou.gif)
这行只说: "Pr
![](/icons/72132int.gif)
the city of theaddress of the second person in the addressbook." ("New York"是每个语句都要打印
![](/icons/72132de.gif)
![](/icons/72132dou2.gif)
)为进
![](/icons/72132yi.gif)
步帮助您理解
![](/icons/72132dou.gif)
py_obj.__
![](/icons/72132class.gif)
__ 就是 "addressbook"
![](/icons/72132dou.gif)
和 XML文档
![](/icons/72132de.gif)
根元素对应
![](/icons/72132dou2.gif)
每个不仅包含简单文本
![](/icons/72132de.gif)
属性都是特定类
![](/icons/72132de.gif)
例子;这个特定类是根据定义它
![](/icons/72132de.gif)
XML 标记命名
![](/icons/72132de.gif)
![](/icons/72132dou2.gif)
如您所见
![](/icons/72132dou.gif)
xml.dom 使用起来通常比较难
![](/icons/72132dou.gif)
它
![](/icons/72132de.gif)
语法也很模糊
![](/icons/72132dou2.gif)
本机 Python对象使用起来就简单得多
![](/icons/72132dou2.gif)
请注意
![](/icons/72132dou.gif)
xml_object
![](/icons/72132if.gif)
y 在内部广泛利用了 DOM
![](/icons/72132dou2.gif)
实际上
![](/icons/72132dou.gif)
每个 XML_Object
![](/icons/72132if.gif)
y 例子都包含了
![](/icons/72132yi.gif)
个 ._dom 属性
![](/icons/72132dou.gif)
该属性是打开
![](/icons/72132de.gif)
XML 文档
![](/icons/72132de.gif)
DOM 树
![](/icons/72132dou2.gif)
不过
![](/icons/72132dou.gif)
创建
![](/icons/72132de.gif)
例子 .make_instance 不包含任何DOM
![](/icons/72132dou.gif)
它是根标记
![](/icons/72132de.gif)
类类型
![](/icons/72132dou2.gif)
设计注意事项、限制和告诫
代码自测
使用 xml_object
![](/icons/72132if.gif)
y
![](/icons/72132dou.gif)
可以利用所有现有
![](/icons/72132de.gif)
常规
![](/icons/72132hanshu.gif)
![](/icons/72132dou2.gif)
pyobj_pr
![](/icons/72132int.gif)
er
![](/icons/72132kh.gif)
是个样本常规
![](/icons/72132hanshu.gif)
![](/icons/72132dou.gif)
其中包括 xml_object
![](/icons/72132if.gif)
y 模块
![](/icons/72132dou2.gif)
该
![](/icons/72132hanshu.gif)
产生 所有Python 对象可读
![](/icons/72132de.gif)
递归表示
![](/icons/72132dou2.gif)
通过将 XML文档表示为本机 Python 文档
![](/icons/72132dou.gif)
可以重用现有
![](/icons/72132de.gif)
、以抽象方式处理 Python对象
![](/icons/72132de.gif)
![](/icons/72132hanshu.gif)
![](/icons/72132dou2.gif)
当然
![](/icons/72132dou.gif)
DOM 对象勉强算得上是 Python对象
![](/icons/72132dou.gif)
但要对这些对象以有用
![](/icons/72132de.gif)
方式使用常规
![](/icons/72132hanshu.gif)
就比较困难
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
![](/icons/72132yinwei.gif)
DOM 对象
![](/icons/72132de.gif)
属性嵌套了 .children 列表
![](/icons/72132dou.gif)
所以使用例如 pyobj_pr
![](/icons/72132int.gif)
er
![](/icons/72132kh.gif)
这样
![](/icons/72132de.gif)
常规
![](/icons/72132hanshu.gif)
将不会产生非常有用
![](/icons/72132de.gif)
输出
![](/icons/72132dou2.gif)
使用类行为
![](/icons/72132de.gif)
窍门技巧
xml_object
![](/icons/72132if.gif)
y 提供了
![](/icons/72132yi.gif)
种非常精妙
![](/icons/72132de.gif)
窍门技巧
![](/icons/72132dou.gif)
使用这种窍门技巧
![](/icons/72132dou.gif)
只有在没有定义类
![](/icons/72132de.gif)
情况下才动态地为属性值定义类
![](/icons/72132dou2.gif)
这可以让您定义具有复杂行为
![](/icons/72132de.gif)
类
![](/icons/72132dou.gif)
和可以放入特定XML 文档内容
![](/icons/72132de.gif)
属性
![](/icons/72132dou2.gif)
假设类 person 使用各种思路方法(如果需要
![](/icons/72132dou.gif)
包括 .__init__
![](/icons/72132kh.gif)
思路方法)进行了预定义
![](/icons/72132dou2.gif)
导入到上例中 XML 地址簿中
![](/icons/72132de.gif)
每个 "person"都将具有给予它
![](/icons/72132de.gif)
所有行为
![](/icons/72132dou.gif)
包括对放入例子中
![](/icons/72132de.gif)
数据
![](/icons/72132de.gif)
操作思路方法
![](/icons/72132dou2.gif)
当然
![](/icons/72132dou.gif)
如果在对文档运行 XML_Object
![](/icons/72132if.gif)
y
![](/icons/72132kh.gif)
的前没有进行预定义
![](/icons/72132dou.gif)
类就只是用于在实际XML 中定义
![](/icons/72132de.gif)
属性
![](/icons/72132de.gif)
容器
![](/icons/72132zifu.gif)
标记处理
XML 标记通常是块级别
![](/icons/72132de.gif)
![](/icons/72132dou.gif)
但某些也属于
![](/icons/72132zifu.gif)
级别
![](/icons/72132dou2.gif)
依我看
![](/icons/72132dou.gif)
自然
![](/icons/72132de.gif)
Python表示在每种情况下各不相同
![](/icons/72132dou2.gif)
块级别
![](/icons/72132de.gif)
子标记易于通过父标记
![](/icons/72132de.gif)
属性表示
![](/icons/72132dou.gif)
父标记是根据子标记命名
![](/icons/72132de.gif)
![](/icons/72132dou2.gif)
子标记属性
![](/icons/72132de.gif)
值是新Python 对象
![](/icons/72132dou.gif)
它也是根据子标记命名
![](/icons/72132de.gif)
类型
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
person 从层次上角度上考虑
![](/icons/72132dou.gif)
可以具有 address 和 misc-info
![](/icons/72132dou2.gif)
使用 Python
![](/icons/72132dou.gif)
可以用 person.address 和 person.misc_info 来引用它们
![](/icons/72132dou2.gif)
使用
![](/icons/72132zifu.gif)
级别
![](/icons/72132de.gif)
标记时
![](/icons/72132dou.gif)
标记
![](/icons/72132de.gif)
内容是文本数据和这些数据
![](/icons/72132de.gif)
标记(常常是排版方面
![](/icons/72132de.gif)
)
![](/icons/72132de.gif)
混合体
![](/icons/72132dou.gif)
子标记在层次结构上不是父标记中
![](/icons/72132de.gif)
![](/icons/72132yi.gif)
部分
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
misc_info 对象实际上没有 ital 属性
![](/icons/72132dou2.gif)
那么
![](/icons/72132dou.gif)
下面
![](/icons/72132de.gif)
XML 类型应该如何表示呢?
<misc-info>One of the <ital>most</ital> talented
actresses on TV.</misc-info>
xml_object
![](/icons/72132if.gif)
y 将
![](/icons/72132yi.gif)
个称为 ._XML
![](/icons/72132de.gif)
特殊属性添加到看起来包含标记
![](/icons/72132zifu.gif)
数据
![](/icons/72132de.gif)
对象/标记
![](/icons/72132dou2.gif)
这个属性在标记中包含文字XML
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
如果给定
![](/icons/72132de.gif)
嵌套对象有 ._XML 属性
![](/icons/72132dou.gif)
pyobj_pr
![](/icons/72132int.gif)
er
![](/icons/72132hanshu.gif)
显示这个文字 XML而不是递归属性
![](/icons/72132dou2.gif)
不过
![](/icons/72132dou.gif)
仍然执行标准递归子标记-对象
![](/icons/72132de.gif)
创建
![](/icons/72132dou.gif)
因此可以知道哪些属性和结构最适当
![](/icons/72132dou2.gif)
本机 Python 对象只包含根文档
许多 XML文档都伴随着标记和
![](/icons/72132zifu.gif)
数据内容提供处理指令和/或注释
![](/icons/72132dou2.gif)
不过
![](/icons/72132dou.gif)
由 XML_Object
![](/icons/72132if.gif)
y 对象
![](/icons/72132de.gif)
.make_instance
![](/icons/72132kh.gif)
思路方法创建
![](/icons/72132de.gif)
本机 Python 对象只包含文档根标记
![](/icons/72132de.gif)
内容
![](/icons/72132dou2.gif)
而且将忽略 XML注释;只表示标记属性和
![](/icons/72132zifu.gif)
数据
![](/icons/72132dou2.gif)
在上面
![](/icons/72132de.gif)
从 XML 文档创建 Python对象举例中
![](/icons/72132dou.gif)
如果保留原始
![](/icons/72132de.gif)
XML_Object
![](/icons/72132if.gif)
y 对象( xml_obj )
![](/icons/72132dou.gif)
可以访问它
![](/icons/72132de.gif)
.processing_instruction 属性
![](/icons/72132dou.gif)
甚至可以访问它
![](/icons/72132de.gif)
._dom 属性来查看本机 Python 对象忽略了什么
![](/icons/72132dou2.gif)
属性类型简化
所有 XML 属性都转换成
![](/icons/72132zifu.gif)
串类型
![](/icons/72132de.gif)
Python 对象属性
![](/icons/72132dou2.gif)
当前
![](/icons/72132dou.gif)
Python不表示属性
![](/icons/72132de.gif)
XML枚举或数字类型
![](/icons/72132dou2.gif)
在以后
![](/icons/72132de.gif)
版本中可能加入这样
![](/icons/72132de.gif)
能力
![](/icons/72132dou.gif)
但这些通常需要DTD
![](/icons/72132dou.gif)
而 xml_object
![](/icons/72132if.gif)
y 不具有 DTD
![](/icons/72132dou2.gif)
子标记属性
XML 子标记 或者由对象类型
![](/icons/72132de.gif)
Python属性表示
![](/icons/72132dou.gif)
或者由这种对象
![](/icons/72132de.gif)
列表表示
![](/icons/72132dou.gif)
这要取决于是
![](/icons/72132yi.gif)
个还是几个相同类型
![](/icons/72132de.gif)
子标记
![](/icons/72132dou2.gif)
即由包含相同类型多个子标记
![](/icons/72132de.gif)
特定标记决定
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
在上面第
![](/icons/72132yi.gif)
个 address.xml 举例中
![](/icons/72132dou.gif)
![](/icons/72132yi.gif)
个人
![](/icons/72132de.gif)
联系信息可能包括 1个家庭电话
![](/icons/72132dou.gif)
而另
![](/icons/72132yi.gif)
个人
![](/icons/72132de.gif)
联系信息可能包括 0 个或几个
![](/icons/72132dou2.gif)
相应地
![](/icons/72132dou.gif)
![](/icons/72132yi.gif)
些 contact_info 对象没有 .home_phone 属性
![](/icons/72132dou.gif)
![](/icons/72132yi.gif)
些具有包含
![](/icons/72132yi.gif)
个 home_phone 对象
![](/icons/72132de.gif)
.home_phone 属性
![](/icons/72132dou.gif)
还有
![](/icons/72132yi.gif)
些具有包含许多 home_phone 对象
![](/icons/72132de.gif)
.home_phone 属性
![](/icons/72132dou2.gif)
尽管使用 DTD
![](/icons/72132de.gif)
情况下有可能施加更多法则
![](/icons/72132dou.gif)
但我认为
![](/icons/72132dou.gif)
Python应用
![](/icons/72132chengxu.gif)
需要这种动态能力
![](/icons/72132dou2.gif)
Python 名称空间限制
要知道 Python 名称空间比 XML名称空间小
![](/icons/72132dou2.gif)
因此
![](/icons/72132dou.gif)
有时要修改标记或属性
![](/icons/72132de.gif)
XML名称
![](/icons/72132dou2.gif)
xml_object
![](/icons/72132if.gif)
y 将破折号、冒号和镑值/散列标志转换成下划线
![](/icons/72132dou2.gif)
该模块不处理任何其它名称空间冲突
![](/icons/72132dou2.gif)
例如
![](/icons/72132dou.gif)
如果XML 文档有标记 <spam-eggs> 、 <spam_eggs> 、 <spam:eggs> 和 <spam#eggs>
![](/icons/72132dou.gif)
那么 xml_object
![](/icons/72132if.gif)
y 所创建
![](/icons/72132de.gif)
Python 对象就不能正确表示 XML文档
![](/icons/72132dou2.gif)
在大多数情况下
![](/icons/72132dou.gif)
这不是问题
![](/icons/72132dou.gif)
![](/icons/72132yinwei.gif)
人们不希望得到
![](/icons/72132de.gif)
XML文档具有这些冲突
![](/icons/72132de.gif)
标记
![](/icons/72132dou2.gif)
xml_object
![](/icons/72132if.gif)
y
![](/icons/72132de.gif)
前景如何?
目前
![](/icons/72132dou.gif)
还不能将本机 Python 对象转回带有和读取
![](/icons/72132de.gif)
XML 文档相同结构
![](/icons/72132de.gif)
XML 文档
![](/icons/72132dou2.gif)
![](/icons/72132yinwei.gif)
xml_object
![](/icons/72132if.gif)
y 故意舍去 XML文档中有关顺序
![](/icons/72132de.gif)
信息来产生更易理解
![](/icons/72132de.gif)
Python对象
![](/icons/72132dou.gif)
所以可能发生问题
![](/icons/72132dou2.gif)
Python 属性没有任何预先确定
![](/icons/72132de.gif)
顺序
![](/icons/72132dou.gif)
但需要XML 标记和属性以特定
![](/icons/72132de.gif)
顺序排列
![](/icons/72132dou2.gif)
即使不 需要XML标记来以特定
![](/icons/72132de.gif)
顺序出现
![](/icons/72132dou.gif)
顺序在语义上还是很重要
![](/icons/72132dou2.gif)
(请注意在重复公共子标记
![](/icons/72132de.gif)
情况下
![](/icons/72132dou.gif)
Python列表维护顺序
![](/icons/72132dou2.gif)
)为了转换回XML
![](/icons/72132dou.gif)
我们需要或者选择任意顺序
![](/icons/72132dou.gif)
或者保留本机 Python对象中
![](/icons/72132de.gif)
顺序信息
![](/icons/72132dou.gif)
使得它看上去不太象 Python
![](/icons/72132dou2.gif)
重新构造 Python 对象中已删除
![](/icons/72132de.gif)
信息
![](/icons/72132de.gif)
![](/icons/72132yi.gif)
个选择是在转换回 XML时强制 DTD
![](/icons/72132dou2.gif)
即使我使用这
![](/icons/72132yi.gif)
做法
![](/icons/72132de.gif)
![](/icons/72132dou.gif)
但在如何处理 Python运行时添加、删除或修改
![](/icons/72132de.gif)
属性时
![](/icons/72132dou.gif)
问题仍然存在
![](/icons/72132dou2.gif)
修改 Python对象可能导致有些部分不符合原始 XML 文档
![](/icons/72132de.gif)
DTD
![](/icons/72132dou2.gif)
不过
![](/icons/72132dou.gif)
如果用户有特定需要
![](/icons/72132dou.gif)
我会将这些能力添加到 xml_object
![](/icons/72132if.gif)
y