Lar*_*ien 7 ruby xml serialization metaprogramming xml-serialization
给定一个中等复杂的XML结构(数十个元素,数百个属性),没有XSD,并且希望创建一个对象模型,那么避免编写样板from_xml()和to_xml()方法的优雅方法是什么?
例如,给定:
<Foo bar="1"><Bat baz="blah"/></Foo>
Run Code Online (Sandbox Code Playgroud)
我如何避免编写无穷无尽的序列:
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...
Run Code Online (Sandbox Code Playgroud)
我不介意明确地创建对象结构; 这是我确信可以通过一些更高级别的编程来处理的序列化......
我不是试图为每个类保存一行或两行(通过将from_xml行为移动到初始化器或类方法等).我正在寻找复制我心理过程的"元"解决方案:
"我知道每个元素都将成为一个类名.我知道每个XML属性都是一个字段名.我知道要分配的代码只是@#{attribute_name} = el.[#{attribute_name}然后递归到子元素.然后反转到to_xml."
我同意建议"构建器"类加上XmlSimple似乎是正确的路径.XML - >哈希 - >? - >对象模型(和利润!)
更新2008-09-18 AM:来自@ Roman,@ fatgeekuk和@ScottKoon的优秀建议似乎打破了问题.我下载了HPricot源码,看看它是如何解决问题的; 关键方法显然是instance_variable_set和class_eval.irb工作非常鼓舞人心,现在正朝着实施方向迈进......非常激动
您能否定义一个缺少的方法来允许您执行以下操作:
@bar = el.bar?这将消除一些样板文件。如果 Bat 总是以这种方式定义,您可以将 XPath 推入初始化方法中,
class Bar
def initialize(el)
self.from_xml(XPath.first(el, "./bat"))
end
end
Run Code Online (Sandbox Code Playgroud)
Hpricot 或 REXML 也可能有帮助。
归档时间: |
|
查看次数: |
2297 次 |
最近记录: |