Workatoのformulaを使い倒してみる3 - to_xml
最近はJSONやcsvに触れることが多いのですが、連携先のシステムがXMLでしかデータを受け付けないことがあったリします。
Workatoでto_xmlしたときにハマったので備忘録として残します。
ハマったこと
今回は以下3つで困りました
- keyの文字列は
_で設定していたのに-に変換されてしまう -
typeが自動で付与されてしまう -
<?xml version="1.0" encoding="UTF-8"?>が自動で付与されてしまう
期待していた結果と現実
例えばこういったJSONデータがあったとします
[
{
"test_name": "foo",
"test_value" : "bar"
},
{
"test_name": "hoge",
"test_value": "fuga"
}
]
その時に to_xmlの出力として期待するのはだいたいこんな感じです
<root>
<root>
<test_name>foo</test_name>
<test_value>bar</test_value>
</root>
<root>
<test_name>hoge</test_name>
<test_value>fuga</test_value>
</root>
</root>
辺に気を使わずにそのまま変換してくれると良いのですが実際に出力されるのは以下になりました
<?xml version="1.0" encoding="UTF-8"?>
<root type="array">
<root>
<test-name>foo</test-name>
<test-value>bar</test-value>
</root>
<root>
<test-name>hoge</test-name>
<test-value>fuga</test-value>
</root>
</root>
今回使いたいケースでは余分な項目やアトリビュートが付与されていたり、 _ で定義していたkey名が - に変換されている。というのが困りでした。
Workatoのレシピと実行ログです
レシピ



実行ログ


どのように解決したか
to_xml のオプションへ引数を設定することで3つ全て解決出来ました
to_xml のヘルプについておさらいです。Workatoさんが教えてくれることは以下でした

ここに root 以外のオプションが記載されていなかったのですが、Workatoのformulaの実態はrubyなのでrubyの to_xml を調べることで他のオプションの存在を知ることが出来ます。
今回使用したのは3つのオプションです
- dasherize
- skip_types
- skip_instruct
rootの設定含めて上記全てのオプションを記載する方法は以下です
{root: 'root', dasherize: false, skip_types: true, skip_instruct: true}
それでは以下で実際に設定したときの出力結果を見ていきます
dasharize
dasharizeが未指定 or Trueだと -への置換が行われます。
そのため dasherize: false を設定しました


実行結果
_ が -に置換されずに表示されています


skip_types

.to_xml({root: 'root', skip_types: true}) を設定しました

実行結果
<root type="array"> だったところから type="array"が消えました


skip_instruct

.to_xml({root: 'root', skip_instruct: true}) を設定しました

実行結果
<?xml version="1.0" encoding="UTF-8"?> という宣言とencode設定が消えました


3つのオプションを全て設定してみる
.to_xml({root: 'root', dasherize: false, skip_types: true, skip_instruct: true}) を設定しました


実行結果
3つのオプションが全て個別設定したときの結果となりました



Discussion