Erlang MySQL результат в XML - PullRequest
       1

Erlang MySQL результат в XML

1 голос
/ 30 марта 2011

У меня есть вывод:

MysqlResult = {selected,["id","first_name","last_name"],
         [{1,"Matt","Williamson"},
         {2,"Matt","Williamson2"}]}

как сделать так:

XML = "
 <result id='1'>
 <first_name>Matt</first_name>
 <last_name>Williamson</last_name>
 </result>
 <result id='2'>
 <first_name>Matt</first_name>
 <last_name>Williamson2</last_name>
 </result>"

Я ищу умный способ поместить его в IQ (ejabberd)

IQ#iq{type = result, sub_el =
                   [{xmlelement, "result",
                   [{"xmlns", ?NS_NAMES}],
                   [{xmlelement, "userinfo", [],
                   [{xmlcdata,"???"??  }]}]}]}

Ответы [ 4 ]

4 голосов
/ 30 марта 2011

Сначала извлеките элемент результатов из кортежа:

{selected, _Columns, Results} = MysqlResult.

Затем преобразуйте его во внутренний XML-формат ejabberd с использованием списка:

XML = [{xmlelement, "result", [{"id", integer_to_list(Id)}],
        [{xmlelement, "first_name", [], [{xmlcdata, FirstName}]},
         {xmlelement, "last_name", [], [{xmlcdata, LastName}]}]}
       || {Id, FirstName, LastName} <- Results].

И вставьте его в свою запись IQ:

IQ#iq{type = result, sub_el =
                   [{xmlelement, "result",
                   [{"xmlns", ?NS_NAMES}],
                   [{xmlelement, "userinfo", [],
                   XML}]}]}

(при условии, что вы хотите, чтобы элементы <result/> были дочерними для элемента <userinfo/>)

1 голос
/ 30 марта 2011

Используйте xmerl для создания XML на Erlang:

1> MysqlResult = {selected,["id","first_name","last_name"],
1>          [{1,"Matt","Williamson"},
1>          {2,"Matt","Williamson2"}]}.
{selected,["id","first_name","last_name"],
          [{1,"Matt","Williamson"},{2,"Matt","Williamson2"}]}

2> {selected, _Columns, Results} = MysqlResult.
{selected,["id","first_name","last_name"],
          [{1,"Matt","Williamson"},{2,"Matt","Williamson2"}]}

3> Content = [{result, [{id, Id}], [{first_name, [First]}, {last_name, [Last]}]} || {Id, First, Last} <- Results].
[{result,[{id,1}],
         [{first_name,["Matt"]},{last_name,["Williamson"]}]},
 {result,[{id,2}],
         [{first_name,["Matt"]},{last_name,["Williamson2"]}]}]

4> xmerl:export_simple(, xmerl_xml).
["<?xml version=\"1.0\"?>",
 [[["<","result",[[" ","id","=\"","1","\""]],">"],
   [[["<","first_name",">"],["Matt"],["</","first_name",">"]],
    [["<","last_name",">"],
     ["Williamson"],
     ["</","last_name",">"]]],
   ["</","result",">"]],
  [["<","result",[[" ","id","=\"","2","\""]],">"],
  [[["<","first_name",">"],["Matt"],["</","first_name",">"]],
    [["<","last_name",">"],
     ["Williamson2"],
     ["</","last_name",">"]]],
   ["</","result",">"]]]]

5> io:format("~s", [v(-1)]).
<?xml version="1.0"?><result id="1"><first_name>Matt</first_name><last_name>Williamson</last_name></result><result id="2"><first_name>Matt</first_name><last_name>Williamson2</last_name></result>ok
0 голосов
/ 31 марта 2011

Решение xmerl абсолютно приемлемо, и, вероятно, оно подходит, если это одноразовая вещь.

Однако, если вы пишете клиент xmpp, даже простой, подумайте об использовании exmpp - https://github.com/processone/exmpp. Вы можете использовать некоторые тактики для извлечения данных и генерации XML, но в целом вспомогательные функции (скорее всего, в модулях exmpp_iq и exmpp_stanza) будут очень удобными.

exmpp тоже никуда не денется - альфа ejabberd3 использует его внутренне (наконец)

0 голосов
/ 30 марта 2011

Попробуйте использовать опции --xml и --execute в клиенте командной строки mysql.

клиент mysql

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