Etant donné une structure XML modérément complexe (des dizaines d'éléments, des centaines d'attributs) sans XSD et une volonté de créer un modèle objet, comment éviter d'écrire des méthodes de type xml() et to_xml()?Ruby code pour sérialisation XML rapide et sale?
Par exemple, étant donné:
<Foo bar="1"><Bat baz="blah"/></Foo>
Comment puis-je éviter d'écrire des séquences infinies de:
class Foo
attr_reader :bar, :bat
def from_xml(el)
@bar = el.attributes['bar']
@bat = Bat.new()
@bat.from_xml(XPath.first(el, "./bat")
end
etc...
Cela ne me dérange pas de créer la structure de l'objet explicitement; il est la sérialisation que je suis sûr que peut être pris en charge avec une programmation de niveau supérieur ...
Je ne cherche pas à enregistrer une ligne ou deux par classe (en déplaçant le comportement from_xml dans initialiseur ou méthode de classe, etc.). Je cherche la solution "méta" qui duplique mon processus mental:
"Je sais que chaque élément va devenir un nom de classe, je sais que chaque attribut XML va être un nom de champ. le code à affecter est simplement @ # {nom_attribut} = el. [# {nom_attribut}], puis se recurcit en sous-éléments et inverser sur to_xml. " Je suis d'accord avec la suggestion qu'une classe "Builder" plus XmlSimple semble être le bon chemin. XML -> Hash ->? -> Modèle d'objet (! Et Profit)
Mise à jour 2008-09-18 AM: d'excellentes suggestions @Roman, @fatgeekuk et @ScottKoon semblent avoir rompu le problème ouvert. J'ai téléchargé HPricot source pour voir comment il a résolu le problème; Les méthodes clés sont clairement instance_variable_set et class_eval. le travail est irb très encourageant, je suis maintenant à la mise en œuvre .... en mouvement très excité