Xml Tree

lua-users home
wiki

xmltree: 一种 XML 的中层结构

(本文档最初是 LazyKit 的一部分。)

本文档描述了一种以 Lua 中的树结构表示 XML 的中层表示。它旨在保存在 lua-users wiki 上,作为记录此主题讨论的地方。

该表示旨在描述 XML 信息集 (XML Infoset) 中的数据,同时保持在习惯性 Lua 代码中易于处理。该表示是一个接口,允许高级实现使用元表 (metatables) 来提供与裸表 (bare tables) 相同的接口。

LxpTreeLazyTree 实现此功能。

示例规范

<paragraph justify='centered'>first child<b>bold</b>second child</paragraph> 
lz = {name="paragraph", attr={justify="centered"}, 
  "first child",
  {name="b", "bold", n=1}
  "second child",
  n=3
} 

草案规范

一个是元素及其内容的 Lua 表表示。该表必须有一个 name 键,用于给出元素的名称。

该树可以有一个 attr 键,它给出了元素所有属性的表。只有字符串键是相关的。(LuaExpat? 使用数字键来标记 DTD 中默认的属性。) 应提供一个方便的迭代器,如 xattrpairs(tree)

如果元素不为空,则每个子节点包含在 tree[1], tree[2] 等中。子节点可以是字符串(表示字符数据内容)或其他树。

解析器应尝试合并相邻的字符数据内容。也就是说,它们应该避免产生如下内容:

{name="p", "Hello w", "orld"} 

解析器应包含一个 n 键,给出子节点的数量。然而,为了容忍代码中的树字面量,通用处理代码应使用如下代码:

tree.n or table.getn(tree) 

(如 xmliter.getn(tree)),就像它们在普通列表上使用 table.getn(list) 而不是 list.n 一样。

(为什么需要单独的 getn?这是必需的,因为 table.getn(tree) 不会显式调用 tree.n,而是使用 rawget(tree, "n")。高级树实现可能需要使用元表调用来查找子节点的数量。)

明确不建模的内容

XML 源文件的句法细节不属于范围。也就是说:

元素上属性的顺序不重要。

CDATA 部分的存在不重要;它只是另一种编写字符数据的方式。

注释不重要。

属性的来源,无论是显式的还是在 DTD 中指定的,都不重要。

明确建模的内容

所有元素,无论是否有重复。

所有字符数据。这包括混合内容。

上述内容的顺序。

应建模的内容

DTD。这可以放在 root.dtd 中。

编码。然而,将所有内容都声明为 UTF-8 可能也不是太糟糕——尤其是对于 USASCII 用户……

命名空间。我对它们没有足够的经验来提出设计。


RecentChanges · preferences
编辑 · 历史
最后编辑于 2004 年 2 月 28 日 下午 6:28 GMT (差异)