如何通过套接字生成和发送XML

时间:2011-11-29 14:47:56

标签: xml sockets erlang

我正在尝试从erlang值生成XML并通过套接字返回该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}

上面的回复被传递回我的socket-generic-behavior,反过来导致

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

有些善良的人能否让我摆脱苦难?

1 个答案:

答案 0 :(得分:0)

似乎有两个问题:

A)这不是格式良好的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] < / em>的)。

[1]这是一个简化 - 有许多其他帖子可以更详细地解释这一点。 https://stackoverflow.com/search?q=erlang+lists+and+strings