Xml 树 |
|
(本文档最初是 LazyKit 的一部分。)
本文档描述了 XML 在 Lua 中作为树的中级表示。它旨在保存到 lua-users wiki 中,作为记录对此主题讨论的地方。
该表示旨在描述来自 XML 信息集的数据,同时保持在惯用的 Lua 代码中易于使用。该表示是一个接口,允许花哨的实现使用元表来提供与裸表相同的接口。
<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 用户来说……
命名空间。我对它们没有足够的经验来提出设计。