2011-11-29 87 views
0

我想從erlang值生成XML並通過套接字返回該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])), 

請問某位好心人能否讓我擺脫不幸?

回答

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漂亮打印機將顯示一個包含所有可打印字符的列表作爲字符串等效項。 [1]

您的作用域變量[1,2]相當於由兩個不可打印字符(ascii 1,ascii 2)組成的字符串。 xml例程不關心它是不可打印的。輸出顯示爲整數列表,因爲它包含不可打印的字符。

如果您將Scope變量更改爲[97,98],則會看到它在生成的xml中顯示爲「ab」。

所以..如果您沒有問題合式結果 -

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

的範圍變量必須是字符串 「[1,2]」(或[$ [$ 1, $ ,, $ 2,$]]或[91,49,44,50,93])。

[1]這是一個簡化 - 有幾十個其他文章更詳細地解釋了這一點。 https://stackoverflow.com/search?q=erlang+lists+and+strings