2009-08-12 33 views
1

我在寫一個生成Atom提要的Lua應用程序。現在,我正在「手工」生成XML - 將文件寫入文件。在Lua中安全地生成XML

這似乎並不是最好的方式,雖然它可能是。我越來越擔心逃跑的準確性。以前有沒有人在Lua做過這樣的事情?

我應該堅持用「手動」生成嗎?或者爲現有的C庫編寫一個包裝?

(Perl中,通過比較,似乎有a plethora of options

回答

1

我現在得到了一個更多的答案來回答我的問題:我已經爲Tim Bray's C XML generator, Genx寫了Lua綁定。

這是它的homepage;這裏是project on Bitbucket。它現在是一個不完整的約束力,但它可以用於簡單的任務:

require 'genx' 
d = genx.new(io.stdout) 

d:startElement('farm') 

d:startElement('crop') 
d:attribute('type', 'fruit') 
d:text('Apricots') 
d:endElement() 

d:startElement('crop') 
d:attribute('type', 'vegetable') 
d:text('Zucchini') 
d:endElement() 

d:endElement() 

產地:

<farm><crop type="fruit">Apricots</crop><crop type="vegetable">Zucchini</crop></farm> 

就個人而言,我覺得這樣的「流媒體」界面稍微更好比樹形一起工作用於生成。

1

有爲lua的各種數據的持久性庫,以及,許多在Lua user's wiki中描述。 page on XML有幫助的信息。

Kepler project上的好人有HTML生成器,可用於生成有效的XML。 (Dead link。)

也有cosmo這是一個可用於生成XML(除其他外)的通用模板框架。

編輯:

我理解模板並不提供保證輸出保持中規中矩的關注。我非常確定,如果一個格式良好的模板生成了一個錯誤的文檔,Cosmo的作者會不高興,但是仍然存在適當引用內容的問題。在我使用它的上下文中,這對我來說不是問題,但我也沒有從不可信的源文本中工作。

有還預計在LuaForge發佈可能有用:

  • Lua Element Tree XML文檔映射到從表的樹。它使用Expat進行閱讀,並聲稱在編寫時生成有效的XML。

  • LuaSOAP包含足夠用於SOAP事務的XML生成和解析。如果您決定編寫自己的發生器,這對於RSS或ATOM等有限方言可能是一個很好的起點。

另外,我知道我已經看到了實現的HTML文檔的一個完整的DOM,並支持兩種解析和文件生成一個項目,但我不記得它的名字還是今天找到它在LuaForge。

編輯2:這是另一個我以前沒有注意到的軟件包,即使它包含在Lua for WindowsLuaXML中。它映射XML和Lua表的嵌套,並且可以讀寫XML。

+0

感謝您的回覆。不幸的是,模板系統(如Cosmo)沒有比手動生成更安全或更容易的 - 我希望能夠幫助我生成格式良好的XML。一些可以保證格式良好的東西會更好。我也沒有看到lua-users.org上的任何XML代碼庫或作爲開普勒的一部分 - luaexpat(http://www.keplerproject.org/luaexpat/)僅用於解析,而libxml2綁定似乎已經消失。 – adrian 2009-08-14 15:41:56

+0

我添加了幾個鏈接到LuaForge項目,也接近您的需求。然而,我還沒有發現一個完美的解決方案。 – RBerteig 2009-08-14 18:02:03

+0

感謝您的具體細節!我肯定會調查這兩個。 – adrian 2009-08-14 20:39:04

2

我也手動生成了XML。我創建了一個看起來像一個API:

function XmlElement(tag, text, attr) 
    ... 
end 

function XmlSubelement(root, tag, text, attr) 
    ... 
end 

然後使用它:

local root = XmlElement("Level0") 
XmlSubelement(root, "Level1", "some text") 
XmlSubelement(root, "Level1", "some more text") 

local s = root:tostring() 

我沒有任何代碼長,但它適合在一個屏幕,包括引用上。

+0

謝謝;這是一個很好的建議。我可能最終會走這條路線,或者只是寫一個像GenX這樣的C庫的綁定。 – adrian 2009-08-14 15:42:55