Xml 树

lua-users home
wiki

xmltree: 用于 XML 的中级结构

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

本文档描述了 XML 在 Lua 中作为树的中级表示。它旨在保存到 lua-users wiki 中,作为记录对此主题讨论的地方。

该表示旨在描述来自 XML 信息集的数据,同时保持在惯用的 Lua 代码中易于使用。该表示是一个接口,允许花哨的实现使用元表来提供与裸表相同的接口。

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 用户来说……

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


最近更改 · 偏好
编辑 · 历史
最后编辑于 2004 年 2 月 29 日凌晨 12:28 GMT (差异)