Как генерировать и отправлять XML через сокет - PullRequest
0 голосов
/ 29 ноября 2011

Я пытаюсь создать XML из значений erlang и вернуть этот XML через сокет.

Итак,

Value = 2, Type = "3", Scope = anatom

Мне бы хотелось

<?xml version="1.0"?> 
   <result value=2 type="3" scope="anatom" />

ЧтоЯ получаю в этом случае экранированный и содержит кавычки вокруг 2 и 3:

"<?xml version=\"1.0\"?><result value=\"2\" type=\"3\" scope=\"anatom\"/>"

Если какое-либо из этих значений имеет список, как в

Value = 2, Type = "3", Scope = [1,2]

, я получаю что-то вроде[60,63,120,109, ...] когда я хотел бы

<?xml version="1.0\"?> <result value=2 type="3" scope=[1,2]/>"

У меня есть подпрограмма форматирования XML, которая выглядит как

format_return({ok, {V, T, S}}) ->
   Data =   {result, 
     [{value, V}, {type, T}, {scope, S}], 
     []},
   xmerl_ucs:to_utf8(xmerl:export_simple([Data], xmerl_xml)).

И она вызывается

 ...
 Reply = xml_formater:format_return(Reply),
 {ok, Reply, State}

Ответ, приведенный выше, возвращается к моему общему типу сокетов, что, в свою очередь, приводит к

gen_tcp:send(Socket, io_lib:fwrite("~p~n",[Reply])),

Может ли какой-нибудь добрый человек избавить меня от моих страданий?

1 Ответ

0 голосов
/ 30 ноября 2011

Кажется, есть две проблемы:

А) это не правильно сформированный XML -

<?xml version="1.0"?> <result value=2 type="3" scope=[1,2]/>

так что вы не сможете его сгенерировать.

B) причина, по которой вы видите вывод в виде списка целых чисел, заключается в связи списков и строк в Erlang - в основном «abc» эквивалентно [$ a, $ b, $ c] ( или [97,98,99] ). erlang pretty-printer отобразит список со всеми печатными символами в виде строкового эквивалента. [1]

ваша переменная Scope [1,2] эквивалентна строке, состоящей из двух непечатаемых символов (ascii 1, ascii 2). подпрограммам xml не важно, что это не для печати. вывод отображается в виде списка целых чисел, поскольку он содержит непечатаемые символы.

если вы измените переменную Scope на [97,98], вы увидите, что в полученном XML-файле она отображается как «ab».

так что ... если вы в порядке с правильно сформированным результатом -

<?xml version="1.0"?> <result value="2" type="3" scope="[1,2]"/>

вашей переменной Scope должна быть строка "[1,2]" ( или [$ [, $ 1, $ ,, $ 2, $]] или [91,49,44,50,93] ). * * тысячу двадцать-один

[1] это упрощение - есть десятки других постов, которые объясняют это более подробно. https://stackoverflow.com/search?q=erlang+lists+and+strings

...