2009-08-12 9 views
1

J'écris une application Lua qui génère un flux Atom. En ce moment, je génère du XML "à la main" en écrivant des chaînes dans des fichiers.Génération sécurisée XML dans Lua

Cela ne semble pas être le meilleur moyen, bien qu'il puisse l'être. Je suis nerveux à l'idée d'avoir une fuite parfaite. Est-ce que quelqu'un a déjà fait quelque chose comme ça à Lua?

Dois-je m'en tenir à générer "à la main"? Ou écrire un wrapper pour une bibliothèque C existante?

(Perl, par comparaison, semble avoir a plethora of options.)

Répondre

1

J'ai maintenant une autre réponse à ma question: J'ai écrit des liaisons Lua pour Tim Bray's C XML generator, Genx.

Voici ses homepage; voici le project on Bitbucket. Il est un droit de liaison incomplète maintenant, mais cela fonctionne pour des tâches simples:

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

produit:

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

Personnellement, je trouve ce genre de « streaming » l'interface un peu plus agréable de travailler avec d'un arborescente interface basée sur la génération.

1

Il existe différentes bibliothèques de persistance de données pour Lua ainsi, beaucoup sont décrits au Lua user's wiki. Le page on XML a des informations qui pourraient aider.

Les gens agréables au Kepler project ont des générateurs pour HTML qui peuvent être utilisés pour générer du XML valide. (Lien mort.)

Il existe également cosmo qui est un framework de modèle généralisé pouvant être utilisé pour générer du XML (entre autres).

Edit:

Je comprends le souci des modèles fournissant pas nécessairement garanties que la production reste bien formée. Je suis à peu près certain que les auteurs de Cosmo seraient mécontents si un modèle bien formé produisait un document mal formé, mais il y a toujours la question de citer correctement le contenu. Dans les contextes où je l'ai utilisé, cela n'a pas été un problème pour moi, mais je n'ai pas non plus travaillé à partir de texte source non fiable.

Des projets sont également disponibles à l'LuaForge qui peuvent être utiles:

  • Lua Element Tree mappe un document XML et d'un arbre de tables. Il utilise Expat pour la lecture, et prétend générer du XML valide lors de l'écriture. Inclut la génération et l'analyse XML suffisantes pour les transactions SOAP. Si vous décidez d'écrire votre propre générateur, cela peut être un bon point de départ pour un dialecte limité tel que RSS ou ATOM.

De plus, je sais que je l'ai vu un projet qui a mis en œuvre un DOM complet pour les documents HTML et pris en charge à la fois la génération d'analyse syntaxique et le document, mais je ne me souviens pas de son nom ou de localiser aujourd'hui à LuaForge.

Edit 2: Voici un autre paquet que je ne l'avais pas remarqué avant, même si elle est incluse dans Lua for Windows: LuaXML. Il mappe entre XML et nid de tables Lua, et peut à la fois lire et écrire du XML.

+0

Merci pour la réponse. Malheureusement, les systèmes de modèles (comme Cosmo) ne sont pas plus sûrs ou plus faciles que de générer à la main - j'aimerais quelque chose qui pourrait m'aider à générer du XML bien formé. Quelque chose qui peut garantir une bonne forme serait encore mieux. Je ne vois pas non plus de bibliothèques de génération XML sur lua-users.org ou dans le cadre de Kepler - luaexpat (http://www.keplerproject.org/luaexpat/) est juste pour l'analyse et les liaisons libxml2 semblent avoir disparu . – adrian

+0

J'ai ajouté quelques liens vers des projets LuaForge qui répondent également à vos besoins. Cependant, je n'ai pas trouvé de solution parfaite. – RBerteig

+0

Merci pour les détails! Je vais certainement enquêter sur ces deux. – adrian

2

J'ai aussi généré du XML à la main. Je créé une API qui ressemble à:

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

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

ensuite l'utiliser:

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

local s = root:tostring() 

Je n'ai pas le code plus longtemps, mais il tenir sur un seul écran, y compris la citation.

+0

Merci; c'est une bonne suggestion. Je pourrais finir par suivre cette route ou simplement écrire une liaison à une bibliothèque C comme GenX. – adrian