我正在尝试从XML中创建键值对元组。我想将任何嵌套的XML转换为列表。这似乎是一个非常常见的操作,但我找不到任何示例。
例如:
应该变成这样:
每个项目都是主包装节点。
我承认下面的代码是模仿并进行了一些调整。它只返回第一个项目元素的列表。而且我不确定如何开始嵌套的项目。
例如:
<something>
<Item>
<name>The Name!</name>
<reviews>
<review>
<review-by>WE</review-by>
<review-points>92</review-points>
</review>
<review>
<review-by>WS</review-by>
<review-points>90</review-points>
</review>
</reviews>
</Item>
</something>
应该变成这样:
[[{"name", "The Name!"}, {"reviews", [{"review-by", "WE"}, {"review-points", 92}], {"review-by", "WS"}, {"review-points", 90}]} ]]
每个项目都是主包装节点。
我承认下面的代码是模仿并进行了一些调整。它只返回第一个项目元素的列表。而且我不确定如何开始嵌套的项目。
-module(reader).
-compile(export_all).
-include_lib("xmerl/include/xmerl.hrl").
parse(FileName) ->
{Records,_} = xmerl_scan:file(FileName),
extract(Records, []).
extract(Record, Acc) when is_record(Record, xmlElement) ->
case Record#xmlElement.name of
'Item' ->
ItemData = lists:foldl(fun extract/2, [], Record#xmlElement.content),
[ {item, ItemData} | Acc ];
_ ->
lists:foldl(fun extract/2, Acc, Record#xmlElement.content)
end;
extract({xmlText, [{Attribute, _}, {'Item', 2}, _], _, _, Value, text}, Acc) ->
[{Attribute, Value}|Acc];
extract(_, Acc) ->
Acc.