含有章节索引的中文 文章模板

-- limodou [2004-09-01 07:02:00]

1. Tree字典处理模块

主要为Meteor提供数据支持,也可做为通用模块来使用

1.1. Tree的来源

Tree的产生来自于Meteor。Meteor在进行模板替换时要求用户提供相应的引用变量的值信息。并且要求值信息的格式主要为字典,同时必须按模块引用的嵌套关系来提供相应的字典数据。因此,按模块引用关系来提供数据就是Meteor最重要的一个环节。这种字典数据与模块引用相匹配,同XML文件格式一样是分级的,结构化的。但直接写字典不是件直观的活。从网上看到有人开发出将XML映身为字典的模块,这样对于XML中层次的访问就可以使用XPath相似的使用方法,如/home/root表示从根结点开始,取home结点下的root结点内容。在Python中,使用字典与XML这种格式数据很象。因此,我决定使用dict作为Tree的内部存储格式。这样Tree的设计目标就是提供一个简单地方法生成多级的树状结构,可以使用XPath风格的关键字来设定或访问相应的数据。

1.2. 技术细节

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':'<&amp;>'}, {'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">&lt;&amp;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的数据类型。

1.2.1. 相似技术

  • 将XML的数据直接映射到Py类型数据中

  • gnosis.xml.objectify

    • 即,对象化XML树!以Py 看方式,然后就可以开始神奇的Py魔术!

1.3. 讨论

gnosis.xml.objectify 与Tree还不太一样。其实,Tree主要是表现为一棵树是第一位的,对于XML的支持是第二位的。而gnosis根本就是对xml的处理。 -- limodou