🦁

Workatoのformulaを使い倒してみる3 - to_xml

2024/05/11に公開

最近はJSONやcsvに触れることが多いのですが、連携先のシステムがXMLでしかデータを受け付けないことがあったリします。
Workatoでto_xmlしたときにハマったので備忘録として残します。

ハマったこと

今回は以下3つで困りました

  1. keyの文字列は_で設定していたのに-に変換されてしまう
  2. typeが自動で付与されてしまう
  3. <?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