質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.81%

  • Ruby

    6579questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 5

    961questions

  • XML

    606questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

【ruby】to_xmlで変換した際についてくる<hash>タグを取り除きたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 66

FumiakiNakao

score 59

Ruby on Railsでjsonを受け取り、それをxmlに変換して別APIにリクエストを送るプログラムを作っています
現状、受け取ったjsonは以下の方法でxmlに変換しております。

xml_input=JSON.parse(request.body.read).to_xml

ですが、この方法で変換した場合、一番上に<hash>がついてしまい、別APIへのリクエストにおいて障害が出てしまいます。

以下、sampleとして、jsonと変換後のxmlを記載いたします。

{
    "title": "Person",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        }
    },
    "required": ["firstName", "lastName"]
}
<?xml version="1.0" encoding="UTF-8" ?>
<!--↓これをなくしたい-->
<hash>
<title>Person</title>
<type>object</type>
<properties>
<firstName>
<type>string</type>
</firstName>
<lastName>
<type>string</type>
</lastName>
<age>
<description>Age in years</description>
<type>integer</type>
<minimumtype="integer">0</minimum>
</age>
</properties>
<requiredtype="array">
<required>firstName</required>
<required>lastName</required>
</required>
</hash>
<!--↑これをなくしたい-->

xml変換時点で、<hash>をつかないようにする もしくは xmlに変換した後に<hash>を取り除く 方法があればご教授いただきたいです。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

調べたところStackOverflowにrootなし版を創った人がいました。

class Hash
  def to_rootless_xml(options = {})
    require 'active_support/builder' unless defined?(Builder)

    options = options.dup
    options[:indent]  ||= 2
    options[:root]    ||= 'hash'
    options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent])

    builder = options[:builder]
    builder.instruct! unless options.delete(:skip_instruct)


    each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) }
    yield builder if block_given?
    builder.target!
  end
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/09 22:56

    教えていただいた方法で解決できました!ありがとうございます!

    キャンセル

0

API ドキュメントを参照してみる限り、 to_xml には <hash/> を別の値に変更する方法はあっても 取り除く方法はないようですね

Nokogiri を用いて値を取り出す方法が考えられるかもしれません

json_string = <<EOF
{
    "title": "Person",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        }
    },
    "required": ["firstName", "lastName"]
}
EOF

json = JSON.parse(json_string)
xml = Nokogiri::XML.parse(json.to_xml)
puts xml.root.children.to_s.strip

上のコードで次のような結果が得られます

<title>Person</title>
  <type>object</type>
  <properties>
    <firstName>
      <type>string</type>
    </firstName>
    <lastName>
      <type>string</type>
    </lastName>
    <age>
      <description>Age in years</description>
      <type>integer</type>
      <minimum type="integer">0</minimum>
    </age>
  </properties>
  <required type="array">
    <required>firstName</required>
    <required>lastName</required>
  </required>

詳しくは Nokogiri のドキュメントを参照してみてください

何か参考になれば幸いです

 Links

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/09 22:48

    回答ありがとうございます
    やってみたところ、hashのタグはなくなったのですが、`<?xml version="1.0" encoding="utf-8"?>`までもがなくなってしまいました…
    ともあれ、一歩先に進めました!ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6579questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 5

    961questions

  • XML

    606questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。