我正在编写一个生成 Atom 提要的 Lua 应用程序。现在,我正在“手动”生成 XML——将字符串写入文件。
这似乎不是最好的方法,尽管它可能是。我对完全正确的转义感到紧张。以前有没有人在 Lua 中做过这样的事情?
我应该坚持“手工”生成吗?或者为现有的 C 库编写一个包装器?
(相比之下,Perl 似乎有很多选择。)
我也手动生成了 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()
我不再有代码,但它适合一个屏幕,包括引用。
Lua 也有各种数据持久性库,许多在Lua 用户的 wiki中有描述。XML 页面上的信息可以提供帮助。
Kepler 项目的好人有 HTML 生成器,可用于生成有效的 XML。(死链接。)
还有cosmo,它是一个通用的模板框架,可用于生成 XML(除其他外)。
编辑:
我理解对模板的关注不一定能保证输出保持良好的格式。我敢肯定,如果格式良好的模板生成了格式错误的文档,Cosmo 的作者会不高兴,但仍然存在正确引用内容的问题。在我使用它的情况下,这对我来说不是问题,但我也没有使用不受信任的源文本工作。
LuaForge 上也有一些可能有用的项目:
Lua Element Tree将 XML 文档映射到表树和从表树映射。它使用 Expat 进行读取,并声称在写入时生成有效的 XML。
LuaSOAP包括足以用于 SOAP 事务的 XML 生成和解析。如果您决定编写自己的生成器,这可能是有限方言(如 RSS 或 ATOM)的一个很好的起点。
另外,我知道我见过一个项目,它为 HTML 文档实现了一个完整的 DOM,并支持解析和文档生成,但我不记得它的名字,也不记得它今天在 LuaForge 上的位置。
编辑 2:这是我之前没有注意到的另一个包,即使它包含在Lua for Windows中:LuaXML。它在 XML 和 Lua 表的嵌套之间进行映射,并且可以读取和写入 XML。
我现在对我的问题有了另一个答案:我已经为Tim Bray 的 C XML 生成器 Genx编写了 Lua 绑定。
这是它的主页;这是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>
就个人而言,我发现这种“流”界面比基于树的生成界面更易于使用。