Учитывая относительно сложную структуру XML (десятки элементов, сотни атрибутов) без XSD и желания создать объектную модель, каков элегантный способ избежать написания шаблонных методов from_xml () и to_xml ()?
Например, учитывая:
<Foo bar="1"><Bat baz="blah"/></Foo>
Как мне избежать написания бесконечных последовательностей:
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...
Я не против создать структуру объекта явно; я уверен, что с сериализацией можно позаботиться о программировании более высокого уровня ...
Я не пытаюсь сохранить одну или две строки для каждого класса (путем перемещения поведения from_xml в инициализатор или метод класса и т. Д.). Я ищу "мета" решение, которое дублирует мой умственный процесс:
"Я знаю, что каждый элемент станет именем класса. Я знаю, что каждый атрибут XML будет именем поля. Я знаю, что назначаемый код - это просто @ # {attribute_name} = el. [# {имя_атрибута}], а затем выполнить рекурсию в подэлементы. И вернуться к to_xml. "
Я согласен с предположением, что класс "builder" плюс XmlSimple кажется правильным путем. XML -> Hash ->? -> Объектная модель (и Прибыль!)
Обновление 2008-09-18 AM: Прекрасные предложения от @Roman, @fatgeekuk и @ScottKoon, похоже, открыли проблему. Я скачал исходник HPricot, чтобы посмотреть, как он решил проблему; Ключевые методы - это instance_variable_set и class_eval. Работа IRB очень воодушевляет, сейчас я двигаюсь к реализации ... Очень взволнован