0

ruby と他のアプリケーションとの間で XML で通信したい。この通信用のスキーマを定義しました。Ruby のデータから XML へ、またはその逆の変換を行うための最良の方法を探しています。

私はXML文書を持っていますmy_document.xml:

<myDocument>
  <number>1</number>
  <distance units="km">20</distance>
</myDocument>

これはスキーマに準拠していmy_document_type.xsdます (ここではあえて記述しません)。

XSD から次のクラスを自動的に生成したいと考えています。これは合理的ですか、実行可能ですか?

# Represents a document created in the form of my_document_type.xsd
class MyDocument
  attr_accessor :number, :distance, :distance_units

  # Allows me to create this object from data in Ruby
  def initialize(data)
    @number = data['number']
    @distance = data['distance']
    @distance_units = data['distance_units']
  end

  # Takes an XML document of the correct form my_document.xml and populates internal systems
  def self.from_xml(xml)
    # Reads the XML and populates:
    doc = ALibrary.load(xml)

    @number = doc.xpath('/number').text()
    @distance = doc.xpath('/distance').text()
    @distance_units = doc.xpath('/distance').attr('units') # Or whatever
  end

  def to_xml
    # Jiggery pokery
  end
end

だから今私はできる:

require 'awesomelibrary'

awesome_class = AwesomeLibrary.load_from_xsd('my_document_type.xsd')

doc = awesome_class.from_xml('my_document.xml')

p doc.distance # => 20
p doc.distance_units # => 'km'

そして、私もできる

doc = awesome_class.new('number' => 10, 'distance_units' => 'inches', 'distance' => '5')

p doc.to_xml

そして得る:

<myDocument>
  <number>10</number>
  <distance units="inches">5</distance>
</myDocument>

これは私にとってかなり強力な機能のように聞こえるので、完全な答えは期待していませんが、すでにこれを行っているライブラリに関するヒント (RXSD を使用してみましたが、それを行う方法がわかりません) this) または実行可能性の考えなど。

前もって感謝します!

4

1 に答える 1

1

のこぎりを試したことがありますか?Slop デコレーターmethod_missing、探している機能を本質的に複製するような方法でドキュメントに実装されます。

于 2013-01-21T13:08:15.130 に答える