@@ -32,8 +32,23 @@ defmodule Soap.Response.Parser do
32
32
end
33
33
34
34
@ spec parse_record ( tuple ( ) ) :: map ( ) | String . t ( )
35
- defp parse_record ( { :xmlElement , tag_name , _ , _ , _ , _ , _ , _ , elements , _ , _ , _ } ) do
36
- % { tag_name => parse_elements ( elements ) }
35
+ defp parse_record ( { :xmlElement , tag_name , _ , _ , _ , _ , _ , attributes , elements , _ , _ , _ } ) do
36
+ attributes_map = parse_attributes ( attributes )
37
+ element_content = parse_elements ( elements )
38
+
39
+ case { attributes_map , element_content } do
40
+ { attrs , content } when map_size ( attrs ) == 0 ->
41
+ % { tag_name => content }
42
+
43
+ { attrs , content } when map_size ( content ) == 0 ->
44
+ % { tag_name => attrs }
45
+
46
+ { attrs , content } when is_map ( content ) ->
47
+ % { tag_name => Map . merge ( attrs , content ) }
48
+
49
+ { attrs , content } ->
50
+ % { tag_name => % { "_attributes" => attrs , "_value" => content } }
51
+ end
37
52
end
38
53
39
54
defp parse_record ( { :xmlText , _ , _ , _ , value , _ } ) , do: transform_record_value ( value )
@@ -42,7 +57,7 @@ defmodule Soap.Response.Parser do
42
57
defp transform_record_value ( value ) when is_list ( value ) , do: value |> to_string ( ) |> String . trim ( )
43
58
defp transform_record_value ( value ) when is_binary ( value ) , do: value |> String . trim ( )
44
59
45
- @ spec parse_elements ( list ( ) | tuple ( ) ) :: map ( )
60
+ @ spec parse_elements ( list ( ) | tuple ( ) ) :: map ( ) | String . t ( )
46
61
defp parse_elements ( [ ] ) , do: % { }
47
62
defp parse_elements ( elements ) when is_tuple ( elements ) , do: parse_record ( elements )
48
63
@@ -106,4 +121,13 @@ defmodule Soap.Response.Parser do
106
121
defp apply_namespace_to_tag ( env_namespace , tag ) , do: env_namespace <> ":" <> tag
107
122
108
123
defp soap_version , do: Application . fetch_env! ( :soap , :globals ) [ :version ]
124
+
125
+ @ spec parse_attributes ( list ( ) ) :: map ( )
126
+ defp parse_attributes ( attributes ) do
127
+ attributes
128
+ |> Enum . map ( fn { :xmlAttribute , name , _ , _ , _ , _ , _ , _ , value , _ } ->
129
+ { name , transform_record_value ( value ) }
130
+ end )
131
+ |> Enum . into ( % { } )
132
+ end
109
133
end
0 commit comments