含有章节索引的中文 文章模板
-- limodou [2004-09-01 07:02:00]
Contents
Tree字典处理模块
主要为Meteor提供数据支持,也可做为通用模块来使用
Tree的来源
Tree的产生来自于Meteor。Meteor在进行模板替换时要求用户提供相应的引用变量的值信息。并且要求值信息的格式主要为字典,同时必须按模块引用的嵌套关系来提供相应的字典数据。因此,按模块引用关系来提供数据就是Meteor最重要的一个环节。这种字典数据与模块引用相匹配,同XML文件格式一样是分级的,结构化的。但直接写字典不是件直观的活。从网上看到有人开发出将XML映身为字典的模块,这样对于XML中层次的访问就可以使用XPath相似的使用方法,如/home/root表示从根结点开始,取home结点下的root结点内容。在Python中,使用字典与XML这种格式数据很象。因此,我决定使用dict作为Tree的内部存储格式。这样Tree的设计目标就是提供一个简单地方法生成多级的树状结构,可以使用XPath风格的关键字来设定或访问相应的数据。
技术细节
Tree的内部都是使用字典来保存。它可以保存成XML文档,或从XML文档中读取数据。但处理为XML格式时,功能会受限。
Tree中元素的使用都是通过字典下标来实现的。字典的下标应该是以'/'号分隔的一个串,表示从根元素开始的一个路径,因此是一个全路径。
当给一个tree赋值时,对于中间的结点,如果不存在,则自动会进行创建。因此,如果你创建了一个空tree。这样做是可以的:
tree = Tree() tree['root/node/value'] = 'hello'
root, node都会自动创建。value为一个叶子结点,可以保存任何值。
如果你想将这样的Tree保存为XML文件,请注意:
- 只可以使用简单类型,象int, long, float, string, unicode string, list, dict, tuple
- 对于tuple保存为xml后,再读回时会变成list
- 不支持[(,), (,)]这种list与tuple相互嵌套的使用。
转换为XML的示例:
tree = Tree() name = '中国' tree['/root/command/test1'] =[{ 'var':'<&>'}, {'var':'limodou'}] tree['/root/command/ttt'] =[unicode(name, 'utf-8'), 100, {'a':False}] tree['/root/command/ttt'] =[(1,2), ('aaa', 'bbb', 'cccc')] #this form is not support
结果:
<?xml version="1.0" encoding="utf-8"?> <tree> <root> <command> <test1> <var type="string"><&amp;></var> </test1> <test1> <var type="string">limodou</var> </test1> <ttt type="int">1</ttt> <ttt type="int">2</ttt> <ttt type="string">aaa</ttt> <ttt type="string">bbb</ttt> <ttt type="string">cccc</ttt> </command> </root> </tree>
可以看出最后一个例子中将list和tuple的混合看成一样的。但在list中可以混合非list或tuple的数据类型。
相似技术
将XML的数据直接映射到Py类型数据中
- 即,对象化XML树!以Py 看方式,然后就可以开始神奇的Py魔术!
讨论
gnosis.xml.objectify 与Tree还不太一样。其实,Tree主要是表现为一棵树是第一位的,对于XML的支持是第二位的。而gnosis根本就是对xml的处理。 -- limodou