XmlToMap
Creates an Elixir Map data structure from an XML string
Usage:
XmlToMap.naive_map("<foo><bar>123</bar></foo>")Results in:
%{"foo" => %{"bar" => "123"}}Converts xml string to an Elixir map with strings for keys, not atoms, since atoms are not garbage collected.
This tool is inspired by Rails Hash.from_xml()
It's simple to use and doesn't require lengthy setup. I call the function "naive", so use with caution because XML may have some structures which do not translate over to a map. For example, naive map has no validation over what should be a collection. If and only if nodes are repeated at the same level will they beome a list.
# there are two points inside foo, so the value of "point" becomes a list. Had "foo" only contained one point then there would be no list but instead one nested map
XmlToMap.naive_map("<foo><point><x>1</x><y>5</y></point><point><x>2</x><y>9</y></point></foo>")
# => %{"foo" => %{"point" => [%{"x" => "1", "y" => "5"}, %{"x" => "2", "y" => "9"}]}}This module is also inspired by Go xml to map package.
Whenever we encounter a node with both attributes and children, we merge them both into a map but prepend "-" to any keys that came from node attributes and use the key "#content" to wrap the value of nodes child.
For example this snippet:
<ItemDimensions>
<Height Units="inches">0.50</Height>
</ItemDimensions>Would become this snippet:
...
"ItemDimensions": {
"Height": {
"#content": "0.50",
"-Units": "inches"
}
}Depends on Erlsom to parse xml then converts the 'simple_form' structure into a map.
I prefer Erlsom because it is the best documented erlang xml parser and because it mentions that it does not produce new atoms during the scanning.
See tests for example usage.
Installation
If available in Hex, the package can be installed as:
-
Add
elixir_xml_to_mapto your list of dependencies inmix.exs:
```elixir
def deps do
[{:elixir_xml_to_map, "~> 0.2"}]
end
```-
Ensure
elixir_xml_to_mapis started before your application:
```elixir
def application do
[applications: [:elixir_xml_to_map]]
end
```