2009-08-12 19 views
1

Ich schreibe eine Lua-Anwendung, die einen Atom-Feed generiert. Im Moment erzeuge ich XML "von Hand" - Strings in Dateien schreiben.XML in Lua sicher generieren

Dies scheint nicht der beste Weg, obwohl es sein kann. Ich werde nervös, weil ich die Flucht genau richtig habe. Hat jemand schon einmal so etwas in Lua gemacht?

Sollte ich beim Generieren "von Hand" bleiben? Oder schreibe einen Wrapper für eine existierende C-Bibliothek?

(Perl, im Vergleich dazu scheint a plethora of options zu haben.)

Antwort

1

Ich habe jetzt eine weitere Antwort auf meine Frage: Ich habe Lua Bindungen für Tim Bray's C XML generator, Genx geschrieben.

Hier ist seine homepage; hier ist die project on Bitbucket. Es ist ein unvollständiges jetzt verbindlich, aber es funktioniert für einfache Aufgaben:

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() 

Produziert:

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

, ich diese Art von „Streaming“ Schnittstelle finden etwas schöner, mit zu arbeiten als ein Baum- basierte Schnittstelle für die Generierung.

1

Es gibt verschiedene Datenpersistenz Bibliotheken für Lua sind auch an der Lua user's wiki viele beschrieben sind. Die page on XML hat Informationen, die helfen könnten.

Die netten Leute an der Kepler project haben Generatoren für HTML, die für die Erzeugung von gültigem XML verwendet werden können. (Dead Link.)

Es gibt auch cosmo, die eine verallgemeinerte Vorlage Framework ist, die verwendet werden kann, um XML (unter anderem) zu generieren.

Edit:

Ich verstehe die Sorge für Vorlagen nicht unbedingt garantiert, vorausgesetzt, dass der Ausgang gut ausgebildet bleibt. Ich bin mir ziemlich sicher, dass die Autoren von Cosmo unglücklich sein würden, wenn eine wohlgeformte Vorlage jemals ein falsches Dokument hervorbringen würde, aber es gibt immer noch das Problem, den Inhalt richtig zu zitieren. In den Kontexten, in denen ich es verwendet habe, war das für mich kein Problem, aber ich habe auch nicht aus nicht vertrauenswürdigem Quelltext gearbeitet.

Es gibt Projekte, auch bei LuaForge geschrieben, die nützlich sein können:

  • Lua Element Tree ordnet ein XML-Dokument zu und von einem Baum von Tabellen. Es verwendet Expat zum Lesen und behauptet, beim Schreiben gültiges XML zu erzeugen.

  • LuaSOAP Beinhaltet XML-Generierung und Parsing ausreichend für SOAP-Transaktionen. Wenn Sie sich entscheiden, Ihren eigenen Generator zu schreiben, könnte dies ein guter Ausgangspunkt für einen begrenzten Dialekt wie RSS oder ATOM sein.

Auch ich weiß, ich habe ein Projekt gesehen, das einen vollständigen DOM für HTML-Dokumente implementiert und sowohl Parsing und Generierung von Dokumenten unterstützt, aber ich kann seinen Namen nicht erinnern oder es heute bei LuaForge finden.

Edit 2: Hier ist ein weiteres Paket, das ich vorher nicht bemerkt hatte, obwohl es in Lua for Windows enthalten ist: LuaXML. Er bildet zwischen XML und Nest von Lua-Tabellen ab und kann XML sowohl lesen als auch schreiben.

+0

Danke für die Antwort. Leider sind Templating-Systeme (wie Cosmo) nicht sicherer oder einfacher als das Generieren von Hand - ich hätte gerne etwas, das mir helfen könnte, wohlgeformtes XML zu generieren. Etwas, das Wohlgeformtheit garantieren kann, wäre noch besser. Ich sehe auch keine XML-Generierungsbibliotheken auf lua-users.org oder als Teil von Kepler - luaexpat (http://www.keplerproject.org/luaexpat/) dient nur zum Parsen und die libxml2-Bindungen scheinen verschwunden zu sein . – adrian

+0

Ich habe ein paar Links zu LuaForge-Projekten hinzugefügt, die ebenfalls auf Ihre Bedürfnisse zugeschnitten sind. Ich habe jedoch keine perfekte Lösung gefunden. – RBerteig

+0

Danke für die Besonderheiten! Ich werde auf jeden Fall beide untersuchen. – adrian

2

Ich habe XML auch von Hand generiert. Ich habe eine API, die wie folgt aussieht:

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

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

Dann, es zu benutzen:

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

local s = root:tostring() 

ich den Code nicht haben nicht mehr, aber es auf einem Bildschirm einschließlich der Angabe passen.

+0

Danke; das ist ein guter Vorschlag. Ich könnte am Ende diese Route gehen oder einfach eine Bindung an eine C-Bibliothek wie GenX schreiben. – adrian