【问题标题】:How to get a Nokogiri object graph to get serialized recursively?如何让 Nokogiri 对象图递归序列化?
【发布时间】:2011-10-04 09:38:21
【问题描述】:

我在 Rails 3 中使用 ROXML 和 Nokogiri 进行 XML/Ruby 对象映射,但在将 Ruby 对象图正确映射到 xml 时遇到问题。

假设以下 3 个类:

class AnyRequestByRequestData
  include ROXML

  xml_name :anyRequestByRequestData
  xml_accessor :request_data
  xml_accessor :result_level_configuration
  xml_accessor :result_level_constraint, :from => :resultLevelConstraint
  xml_accessor :result_format
end

class ResultLevelConstraint
  include ROXML

  xml_name :resultLevelConstraint
  xml_accessor :result_level_constraint_items, :as => [ResultLevelConstraintItem], :in => :resultLevelConstraintItems
end

class ResultLevelConstraintItem
  include ROXML

  xml_name :resultLevelConstraintItem
  xml_accessor :result_level_configuration_item, :from => "@resultLevelConfigurationItem"
  xml_accessor :offset
  xml_accessor :limit
end

让我们实例化它们:

a = AnyRequestByRequestData.new
b = ResultLevelConstraint.new
c = ResultLevelConstraintItem.new
c.result_level_configuration_item = 1
c.offset = 0
c.limit = 10
b.result_level_constraint_items = [c]
a.result_level_constraint = b

调用 xml = a.to_xml 返回:

#<Nokogiri::XML::Element:0xb2107e name="anyRequestByRequestData" children=[#<Nokogiri::XML::Element:0xb20eee name="resultLevelConstraint" children=[#<Nokogiri::XML::Text:0xb208fe "#<ResultLevelConstraint:0x226143c>">]>]>

调用 xml.serialize :save_with => 0 返回:

<anyRequestByRequestData><resultLevelConstraint>#&lt;ResultLevelConstraint:0x226143c&gt;</resultLevelConstraint></anyRequestByRequestData>

所以,这里发生的事情是对象 ResultLevelConstraint 没有被正确序列化。

调用 b.to_xml.serialize :save_with => 0 返回正确序列化的 ResultLevelConstraint 对象:

<resultLevelConstraint><resultLevelConstraintItems><resultLevelConstraintItem resultLevelConfigurationItem=\"1\"><offset>0</offset><limit>10</limit></resultLevelConstraintItem></resultLevelConstraintItems></resultLevelConstraint>

但是,这并不能满足我的需求。我有深层对象图,只想在根对象(本例中为 a)上调用 to_xml.serialize。所以,这里发生的事情是 serialize 似乎没有被递归调用。

我认为这是 Nokogiri 问题,因为在对象上调用的 to_xml 似乎返回了正确的 Nokogiri 对象图。所以 Roxml 似乎工作正常......

【问题讨论】:

标签: ruby-on-rails xml ruby-on-rails-3 serialization nokogiri


【解决方案1】:

它只需要 AnyRequestByRequestData 的 xml_accessor 中的类型:

xml_accessor :result_level_constraint, :as => ResultLevelConstraint, :from => :resultLevelConstraint

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2011-02-07
    • 2015-10-02
    • 2011-01-11
    • 1970-01-01
    • 2014-06-10
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多