给定一个中等复杂的 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.[#{attribute_name} ] 然后递归到子元素。然后在 to_xml 上反向。
我同意“构建器”类加上 XmlSimple 似乎是正确的道路的建议。XML -> 哈希 -> ? -> 对象模型(和利润!)
2008 年 9 月 18 日更新:@Roman、@fatgeekuk 和 @ScottKoon 的出色建议似乎已经解决了问题。我下载了 HPricot 源代码,看看它是如何解决问题的;关键方法显然是 instance_variable_set 和 class_eval 。irb 的工作非常令人鼓舞,现在正在走向实施....非常兴奋