この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
rails に xmlを出力するときに便利な to_xml メソッドがありますが
とある要件に対応する為に
ちょっと加工が必要だったことがあったのでメモです。
おもに困ったこと
1. エンティティ名が to_json のときと違う。エンティティー名に _ があるときに – にされてしまう。
2. タグの属性に type=“値のクラス” が入ってしまう。
3. 文字コードが変えられない。 <?xml version=”1.0″ encoding=”UTF-8”?> というタグが入ってしまう。
環境
CentOS Linux release 7.1.1503 (Core)
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
Rails 4.2.2
やっつけソース
def xml_source(object, xml_char) # xml内容作成の定義。
<<-end_of_xml_source
<?xml version=\"1.0\" encoding=\"#{xml_char}\"?>
#{object.to_xml(dasherize: false, skip_types: true, skip_instruct: true).gsub('"', '"').gsub("'", ''')}
end_of_xml_source
end
xml_source(object, xml_char).encode(xml_char, invalid: :replace, undef: :replace)
解説
1. to_xml メソッドの引数に dasharize: false を指定することで解決。
2. 同じく skip_types: true を指定することで解決。
3. 同じくskip_instruct: true を指定することでヘッダのタグを表示しなくできる。所望のヘッダタグの取り付けと実際の文字コードの変換はxml 出力後に行う。文字コードの変換には encode メソッドを使用した。変換不可能な文字は置換。
他に対応した点
nil の値があると <エンティティ名 nil=“true”> のようなタグが発行されてしまう為、データに nil があったら ” に変換。
xml出力のときだけ出したくなかった文字は to_xml後にgsub で変換。