Xml Tree |
|
(這份文件原本是 LazyKit 的一部分。)
此文件說明 XML 的中階樹狀結構表示方式。其用意是儲存在 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)
找出),這和在一般清單(而非 list.n
)中使用 table.getn(list)
的方式相同。
(為何需要獨立的 getn
?這是必要的,因為 table.getn(tree)
並未明確呼叫 tree.n
,而是使用 rawget(tree, "n")
。精緻的樹實作可能需要使用元表呼叫才能找出子項數量。)
XML 原始檔案的語法細節不在範圍內,例如:
元素屬性的順序並不重要。
CDATA 區段的存在與否並無特別意義;這只是撰寫字元資料的另一種方式。
註解並不重要。
屬性的來源,無論是明確指出或是在 DTD 中指定,都無關緊要。
所有元素,無論是否重複。
所有字元資料,包括混合內容。
上述元素的順序。
DTD。這可以放入 root.dtd
中。
編碼。不過,宣告所有內容皆為 UTF-8 可能沒有什麼問題---尤其是對 USASCII 使用者而言....
命名空間。我沒有足夠經驗提出設計。