[Lua] 使用 xml2lua 套件,將 XML 轉成 Lua 表格讀取資料
今天需要用 Lua 來讀取一個 XML 的檔案,
查了一下,應該是有好幾個套件可以做這件事,
像 Penlight 的 pl.xml 模組,以及這次我使用的 xml2lua 模組。
沒有特別比較過好壞,
只是單純先看到 xml2lua 就先拿來用了~XD
1. 安裝 xml2lua
用 luarocks 就可以安裝 xml2lua,
因為它是純 Lua 寫出來的模組,因此不需要編譯其他的 C 函式庫,
就不像安裝 lua-zlib 或 lua-http 套件時,還要給額外的參數:
sudo luarocks install xml2lua
2. 使用 xml2lua
這邊直接拿官網的例子來跑跑看 xml2lua 吧~
先準備一個 handler 和 parser:
> xml2lua = require "xml2lua"
> handler = require("xmlhandler.tree")
> parser = xml2lua.parser(handler)
接著準備一個 XML 讓 parser 呼叫 parser() 來解析:
> xml = [[ >> <people> >> <person type="natural"> >> <name>Manoel</name> >> <city>Palmas-TO</city> >> </person> >> <person type="legal"> >> <name>University of Brasília</name> >> <city>Brasília-DF</city> >> </person> >> </people> >> ]] > parser:parse(xml)
解析完的資料會放在 handler.root 這張表裡面。
如果用 pl.pretty 來看的話,會像這樣:
> pretty = require "pl.pretty"
> pretty(handler.root.people.person)
{
["arg 1"] = {
{
_attr = {
type = "natural"
},
city = "Palmas-TO",
name = "Manoel"
},
{
_attr = {
type = "legal"
},
city = "Brasília-DF",
name = "University of Brasília"
}
}
}
因為 people 下面有兩個 person,因此可以這樣取得資料:
> handler.root.people.person[1].city Palmas-TO > handler.root.people.person[1].name Manoel > handler.root.people.person[1]._attr.type natural > handler.root.people.person[2]._attr.type legal
一般在程式裡,可能會這麼取資料:
> for i, p in ipairs(handler.root.people.person) do print(string.format("%d=name(%s), city(%s), type(%s)", i, p.name, p.city, p._attr.type)) end
1=name(Manoel), city(Palmas-TO), type(natural)
2=name(University of Brasília), city(Brasília-DF), type(legal)
這樣就可以順利的讀取 XML 裡的資料囉~
(本頁面已被瀏覽過 828 次)