将xml转换为元组和列表
我很兴奋能开始我的erlang之旅,但我已经在这上面呆了几天了,我开始担心我不能在最后期限前完成任务 我试图用xml创建键、值对元组。我想从任何嵌套的xml中列出一个列表。这似乎是一件很平常的事情,但我找不到任何例子 例如:将xml转换为元组和列表,xml,erlang,Xml,Erlang,我很兴奋能开始我的erlang之旅,但我已经在这上面呆了几天了,我开始担心我不能在最后期限前完成任务 我试图用xml创建键、值对元组。我想从任何嵌套的xml中列出一个列表。这似乎是一件很平常的事情,但我找不到任何例子 例如: <something> <Item> <name>The Name!</name> <reviews>
<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>
其中,每个项目都是主包装器节点
我承认我已经修改了下面的代码。它只返回第一项元素的列表。我不知道如何开始嵌套的
非常感谢
-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.
试试看。函数“erlsom:simple_form(XML)”将为您提供{Node,Attrib,Value}:
{"something",[],
[{"Item",[],
[{"name",[],["The Name!"]},
{"reviews",[],
[{"review",[],
[{"review-by",[],["WE"]},{"review-points",[],["92"]}]},
{"review",[],
[{"review-by",[],["WS"]},{"review-points",[],["90"]}]}]}]}]}
但是,如果您想删除属性,那么可以编写一个有趣的代码传递给erlsom SAX解析器,或者重新格式化simple_表单的输出。类似这样的内容(用于重新格式化输出):
这将产生以下输出:
{"something",
[{"Item",
[{"name","The Name!"},
{"reviews",
[{"review",[{"review-by","WE"},{"review-points","92"}]},
{"review",[{"review-by","WS"},{"review-points","90"}]}]}]}]}
注意,我还没有在非常大的XML文件上测试这一点。你应该做一些测试并考虑MEM问题。
-module(reader).
-compile(export_all).
convert(XML)->
case erlsom:simple_form(XML) of
{ok,{Node,_Attrib,Value},_}->
{Node,xml_to_kv(Value)};
Err->
Err
end.
xml_to_kv([{Node,_Attrib,Value}|T])->
[{Node,lists:flatten(xml_to_kv(Value))}|xml_to_kv(T)];
xml_to_kv(Value)->
Value.
{"something",
[{"Item",
[{"name","The Name!"},
{"reviews",
[{"review",[{"review-by","WE"},{"review-points","92"}]},
{"review",[{"review-by","WS"},{"review-points","90"}]}]}]}]}