Как получить граф объектов Nokogiri для рекурсивного сериализации? - PullRequest
1 голос
/ 13 июля 2011

Я использую ROXML с Nokogiri для сопоставления объектов XML / Ruby в Rails 3 и у меня проблема с правильным отображением графа объектов 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>

Однако это не удовлетворяет моим потребностям.У меня есть глубокие графы объектов, и я хочу только вызвать to_xml.serialize для корневого объекта (a в этом примере).Итак, здесь произошло то, что serialize , похоже, не вызывалось рекурсивно.

Я думаю, что это проблема Нокогири, потому что to_xml , вызываемая для объекта, похоже, возвращает правильный граф объекта Нокогири.Так что Roxml вроде бы работает нормально ...

1 Ответ

1 голос
/ 22 июля 2011

Ему просто нужен тип в xml_accessor AnyRequestByRequestData:

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