Current section
Files
Jump to
Current section
Files
lib/ex_wechat/helpers/xml_parser.ex
defmodule ExWechat.Helpers.XmlParser do
@moduledoc """
Parse xml string to elixir map.
"""
@doc """
Parse xml string to elixir map.
"""
def parse_xml(xml, result \\ %{})
def parse_xml([], result), do: result
def parse_xml(xml, result) when is_binary(xml) do
Floki.find(xml, "xml")
|> parse_xml(result)
end
def parse_xml([{"xml", [], attrs}], result) do
parse_xml(attrs, result)
end
def parse_xml([{key, _, [value]} | tail], result) when is_binary(value) do
result = Map.put(result, String.to_atom(key), value)
parse_xml(tail, result)
end
def parse_xml([{node, [], [{_, [], _} | _tail] = attrs}], result) when is_list(attrs) do
Map.put(result, String.to_atom(node), parse_xml(attrs, %{}))
end
def parse_xml([{node, [], _attrs} | _tail] = attrs, result) when is_list(attrs) do
key = String.to_atom(node)
value = Enum.map(attrs, fn(attr)-> parse_xml(attr, %{}) end)
Map.put(result, key, value)
end
def parse_xml({_node, [], attrs}, result) do
parse_xml(attrs, result)
end
end