defmodule WechatPay.Utils.XMLBuilder do @moduledoc """ Module to convert a map to XML string """ alias WechatPay.JSON require JSON @doc """ Convert a map to XML string ## Example ```elixir iex> WechatPay.Utils.XMLBuilder.to_xml(%{foo: "bar"}) ...> "" ``` """ @spec to_xml(map) :: String.t() def to_xml(data) when is_map(data) do data |> Map.to_list() |> Keyword.delete(:__struct__) |> Enum.map(&build_node/1) |> Enum.join() |> wrap_xml end defp build_node({_key, nil}) do # ignore nil values end defp build_node({key, value}) when is_map(value) do "<#{key}>" end defp build_node({key, value}) when is_binary(value) do "<#{key}>" end defp build_node({key, value}) when is_integer(value) do "<#{key}>" end defp wrap_xml(string) do "#{string}" end end