xml - 用于快速和肮脏的 XML 序列化的 Ruby 代码?

标签 xml ruby serialization xml-serialization metaprogramming

给定一个没有 XSD 的中等复杂的 XML 结构(数十个元素,数百个属性)并希望创建对象模型,避免编写样板 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-09-18 AM:来自@Roman、@fatgeekuk 和@ScottKoon 的极好的建议似乎已经解决了这个问题。我下载了 HPricot 源代码,看看它是如何解决问题的;关键方法显然是 instance_variable_set 和 class_eval 。 irb 的工作非常令人鼓舞,我现在正在实现中....非常兴奋

最佳答案

您可以使用 Builder 而不是创建您的 to_xml 方法,并且您可以使用 XMLSimple 将您的 xml 文件拉入哈希而不是使用 from_xml 方法。不幸的是,我不确定您是否真的会从使用这些技术中获得那么多。

关于xml - 用于快速和肮脏的 XML 序列化的 Ruby 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/87021/

相关文章:

ruby - 如何将多个 block 传递给 ruby​​ 中的方法?

c# - Entity Framework 和 Web API ObjectDisposedException

xml - SGML 和 XML 有什么区别?

ruby - 从 TestCase 调用 Sinatra 应用程序实例方法

xml - powershell xml 排序节点和 replacechild

html - 对不在 <form> 标签中的表单使用 ruby​​ mechanize?

json - JSON响应的反序列化在字符串中保留引号

android - C++以二进制流形式读取文件,在中间随机跳过字节

xml - 如何以结构化方式返回 Schematron 验证结果

java - 我想自定义 android youtube 播放器 api 的布局