2009-08-12 4 views
1

私はAtomフィードを生成するLuaアプリケーションを作成しています。今、XMLを「手作業で」生成しています。文字列をファイルに書き出します。安全にLuaでXMLを生成する

これは最良の方法のようではありませんが、そうかもしれません。私はちょうどエスケープすることについて緊張している。ルアで誰もこれのようなことをやったことがありますか?

「手で」生成することに固執すべきですか?または、既存の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> 

、私はTREE-よりで動作するように少しよりよいインタフェースを「ストリーミング」のこの種を見つけます生成のためのベースのインターフェイスです。

1

Luaのための各種データの永続性ライブラリが同様にありますが、多くはLua user's wikiで説明されています。 page on XMLには役立つ情報があります。

Kepler projectの素敵な人々は、有効なXMLを生成するために使用できるHTML用のジェネレータを持っています。 (デッドリンク)

また、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生成ライブラリも見ないか、Keplerの一環としてluaexpat(http://www.keplerproject.org/luaexpat/)を解析するだけであり、libxml2のバインディングは消滅したようです。 – adrian

+0

私はLuaForgeプロジェクトへのリンクをいくつか追加しました。私はしかし、完璧な解決策を見つけたことはありません。 – RBerteig

+0

詳細をありがとう!私は間違いなくこれらの両方を調査します。 – adrian

2

私は手でXMLを生成しました。私はもはや、コードを持っていないが、それは引用を含め1つの画面に収まら

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

local s = root:tostring() 

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

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

はそれを使用するために:私はのように見えるAPIを作成しました。

+0

ありがとうございます。それは良い提案です。私はこのルートに行くか、GenXのようなCライブラリへのバインディングを書いてしまうかもしれません。 – adrian

関連する問題