QA@IT
«質問へ戻る

質問を投稿

RubyでXMLに対応したクラスを扱うときのベストプラクティス

以下の2つのことをやりたいとします。

  • XMLが返ってくるAPIで得られたレスポンスを使ってXMLの構造に対応したクラスを生成できる
  • クラスを自分でnewしていろいろパラメータを設定したあとto_xmlでXML文字列にできる

xmlのざっくりした構造を書くとこんな感じものを想定しています。

<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="">
  <entry>
    ..
  </entry>
  <entry>
    ..
  </entry>
  ..
</feed>

この内、繰り返し要素であるentryに相当するEntryのようなクラスを用意して次のような形で使うのはどうかと考えています。

class Entry
  def self.from_xml(xml)
    # initialize from xml
  end

  def to_xml
    # generate xml string 
  end
end

entry = Entry.from_xml("<entry>..</entry>")

# edit entry then convert to xml string
entry.to_xml

前置きが長くてすみませんが、ここからが質問です。

このような場合に適していると思われる実装はどういったものがあるでしょうか?もしくは、XMLを扱うならクラスにしないほうがいいなどそもそもの考え方がずれていたらご指摘いただけたらと思います。

自分で考えたのは以下の2つの方法ですがどう考えてもイマイチにしか思えませんでした。

  • 全てのフィールド(?)に対応する変数を用意する、@titleなど。 → 実装が冗長になる
  • XMLをハッシュに変換しそのハッシュを持つ。→値の出し入れがすごく大変
以下の2つのことをやりたいとします。

- XMLが返ってくるAPIで得られたレスポンスを使ってXMLの構造に対応したクラスを生成できる
- クラスを自分でnewしていろいろパラメータを設定したあと`to_xml`でXML文字列にできる

xmlのざっくりした構造を書くとこんな感じものを想定しています。

```xml
<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="">
  <entry>
    ..
  </entry>
  <entry>
    ..
  </entry>
  ..
</feed>
```

この内、繰り返し要素である`entry`に相当するEntryのようなクラスを用意して次のような形で使うのはどうかと考えています。

```ruby
class Entry
  def self.from_xml(xml)
    # initialize from xml
  end

  def to_xml
    # generate xml string 
  end
end

entry = Entry.from_xml("<entry>..</entry>")

# edit entry then convert to xml string
entry.to_xml
```

前置きが長くてすみませんが、ここからが質問です。

このような場合に適していると思われる実装はどういったものがあるでしょうか?もしくは、XMLを扱うならクラスにしないほうがいいなどそもそもの考え方がずれていたらご指摘いただけたらと思います。

自分で考えたのは以下の2つの方法ですがどう考えてもイマイチにしか思えませんでした。

- 全てのフィールド(?)に対応する変数を用意する、`@title`など。 → 実装が冗長になる
- XMLをハッシュに変換しそのハッシュを持つ。→値の出し入れがすごく大変