【问题标题】:How to generate and send XML through a socket如何通过套接字生成和发送 XML
【发布时间】:2012-01-08 21:48:56
【问题描述】:

我正在尝试从 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}

上面的回复被传递回我的套接字通用行为,这反过来又导致

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

可以请好心人让我摆脱痛苦吗?

【问题讨论】:

    标签: xml sockets erlang


    【解决方案1】:

    似乎有两个问题:

    A) 这不是格式良好的 XML --

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

    所以你将无法生成它。

    B) 您将输出视为整数列表的原因是因为 Erlang 中列表和字符串的关系 - 基本上 "abc" 等价于 [$a,$b,$c] (或 [97,98,99])。 erlang 漂亮的打印机将显示一个列表,其中包含所有可打印字符作为等效字符串。 [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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多