Erlang XML для кортежей и списков - PullRequest
4 голосов
/ 19 августа 2010

Я очень взволнован, чтобы начать свое путешествие по Эрлангу, но я застрял в этом несколько дней и начинаю бояться, что не уложусь в срок.

Я пытаюсь создать ключ, значение пары кортежей из 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.

1 Ответ

5 голосов
/ 23 августа 2010

Дайте Эрлсом попробовать. Функция "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"]}]}]}]}]}

Однако, если вы хотите отбросить атрибуты, вы можете написать забавную фразу для передачи в анализатор SAX erlsom или переформатировать вывод simple_form. Примерно так (переформатировать вывод):

-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"}]}]}]}]}

Обратите внимание, я не проверял это на очень больших файлах XML. Вы должны выполнить несколько тестов и рассмотреть вопросы мема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...