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