2015-09-10 3 views
2

Я начал изучать erlang, но я борется с преобразованиями типов данных в erlang.Как преобразовать список кортежей в формат XML, используя xmerl (erlang)

У меня есть ответ от MySQL:

[{message,[{id,"500"}], 
    [{from_user,"[email protected]"}], 
    [{to_user,"[email protected]"}], 
    [{txt,"Text message from admin to user"}], 
    [{created_at,"2015-08-28 17:48:41"}]}, 
    ... 
{message,[{id,"550"}], 
    [{from_user,"[email protected]"}], 
    [{to_user,"[email protected]"}], 
    [{txt,"message from test to admin"}], 
    [{created_at,"2015-08-28 17:48:42"}]}] 

Но мне нужно возвращать XML (приложение/XML):

<chat> 
    <message> 
    <field name="id">500</field> 
    <field name="from_user">[email protected]</field> 
    <field name="to_user">[email protected]</field> 
    <field name="txt">Text message from admin to user</field> 
    <field name="created_at">2015-08-28 17:48:41</field> 
    </message> 
    ... 
    <message> 
    <field name="id">550</field> 
    <field name="from_user">[email protected]</field> 
    <field name="to_user">[email protected]</field> 
    <field name="txt">message from test to admin</field> 
    <field name="created_at">2015-08-28 17:48:42</field> 
    </message> 
</chat> 

Я следовал ответ на этот вопрос, но не работает: erlang mysql result to xml . Я не получил часть: Io: формат ("~ S", [v (-1)])

, и я попытался код следуя этому примеру: Generating XML in Erlang using xmerl

Если предположить, что ответ был:

Fields = [[<<"44">>,<<"[email protected]">>, <<"[email protected]">>,<<"message here">>, <<"2015-09-08 10:49:26">>], 
     [<<"47">>,<<"[email protected]">>, <<"[email protected]">>,<<"response to message">>, <<"2015-09-08 10:49:36">>]]. 

то, что я пытался в моем модуле:

-define(xml_prolog, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"). 
... 

make_xml(Fields) -> 
    Xml = xmerl:export_simple([xml_simple(Fields)], 
          xmerl_xml, 
          [{prolog, ?xml_prolog}]), 
    unicode:characters_to_binary(Xml). 

xml_simple(Fields) -> 
    {chat, [{message, lists:map(
    fun(Entry) -> 
     conversion(Entry) 
    end, Fields)}]}. 

conversion(List_of_lists) -> 
    Tmp = lists:map(
    fun(E) -> 
     entries_to_tuple_of_lists(E) 
    end, List_of_lists), 
    [ {field, [{id, Id}], 
      [{from_user, From}], 
      [{to_user, To}], 
      [{txt, Body}], 
      [{created_at, Date}]} || {Id,From,To,Body,Date} <- Tmp]. 

entries_to_tuple_of_lists(Entries) -> 
    list_to_tuple(
    lists:map(
     fun(Elem) -> 
      bitstring_to_list(Elem) 
     end, Entries)). 
+1

«v (-1)» относится к результату предыдущей команды в оболочке Erlang, это помогает? В любом случае, было бы лучше, если бы вы показали, что вы пробовали, и какие ошибки вы получили в результате, иначе любой, кто отвечает, останется в основном повторением совета, уже приведенного в том, с чем вы связались. –

ответ

1

Я думаю, что это будет проще изменить функции из примера для ваших данных. Результат:

-module(testxml). 

-export([makeXml/1]). 

-define(xml_prolog, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"). 

fields_to_xml_simple2(Fields) -> 
    [ 
    fun(X) -> [{K, V}] = element(X, Fields), {field, [{name, atom_to_list(K)}], [V]} end(E) 
    || E <- lists:seq(2, tuple_size(Fields))]. 

doc_xml_simple2(Fields) -> 
    {chat, [{message, fields_to_xml_simple2(K)} || K <- Fields]}. 

makeXml(Fields) -> 
    Xml = xmerl:export_simple([doc_xml_simple2(Fields)], xmerl_xml, 
    [{prolog, ?xml_prolog}]), 
    unicode:characters_to_binary(Xml). 
1

Я не знаю, если это лучший способ, но он работал:

Функции:

entries_to_tuple_lists(Entries) -> 
    list_to_tuple(
    lists:map(
     fun(Elem) -> 
     bitstring_to_list(Elem) 
     end, Entries)). 

element_to_tuple_list(Fields) -> 
    Tmp = lists:map(
    fun(E) -> 
     entries_to_tuple_lists(E) 
    end, Fields), 
    [{message,[{id, Id}], 
      [{from_user,[From]}, 
      {to_user,[To]}, 
      {txt,[Body]}, 
      {created_at,[Date]}]} || {Id,From,To,Body,Date} <- Tmp]. 

chat_to_xml(Messages) -> 
    {chat, element_to_tuple_list(Messages)}. 

make_xml(SqlReturn) -> 
    Xml = xmerl:export_simple([chat_to_xml(SqlReturn)], 
    xmerl_xml, 
    [{prolog, ?xml_prolog}]), 
    unicode:characters_to_binary(Xml). 

И XML получается:

<chat> 
    <message id="500"> 
    <from_user>[email protected]</from_user> 
    <to_user>[email protected]</to_user> 
    <txt>Text message from admin to user</txt> 
    <created_at>2015-08-28 17:48:41</created_at> 
    </message> 
    ... 
    <message id="550"> 
    <from_user>[email protected]</from_user> 
    <to_user>[email protected]</to_user> 
    <txt>message from test to admin</txt> 
    <created_at>2015-08-28 17:48:42</created_at> 
    </message> 
</chat> 
Смежные вопросы