max*_*max 1 xml erlang ejabberd
我有这个XML:
<message from="adminhash@localhost/xmpphp2" to="queue@springfruitdev"
type="service" id="service1"><body>JSON</body></message>
Run Code Online (Sandbox Code Playgroud)
我想在标签之间提取文本.
以下是它在erlang中的表示方式:
{xmlel,<<"message">>,
[{<<"xml:lang">>,<<>>},
{<<"from">>,<<"adminhash@localhost/xmpphp2">>},
{<<"to">>,<<"queue@springfruitdev">>},
{<<"type">>,<<"service">>},
{<<"id">>,<<"service1">>}],
[{xmlel,<<"body">>,[],[{xmlcdata,<<"JSON">>}]}]}}
我通过模式匹配尝试了什么:
element(1,list_to_tuple(element(4,element(3,X)))).
Run Code Online (Sandbox Code Playgroud)
结果:
{xmlel,<<"body">>,[],[{xmlcdata,<<"JSON">>}]}
Run Code Online (Sandbox Code Playgroud)
首先,我能以更优雅的方式提取xmlcdata吗?
xml.erl中的另一个选项是函数
XML:get_path_s/2
TL; DR;
要获取body cdata,您将使用以下内容
>xml:get_path_s(El,[{elem,"body"},cdata]).
"JSON"
Run Code Online (Sandbox Code Playgroud)
更多数据
你提供的Xml有第一个参数,第二个参数是带有以下sintax的列表,
我将提供以下示例以便更好地理解.想象一下你的xml如下
<message from="adminhash@localhost/xmpphp2" to="queue@springfruitdev"
type="service" id="service1">
<body>JSON</body>
<writer id="123">
<name>William</name>
<country>England</country>
</writer>
</message>
Run Code Online (Sandbox Code Playgroud)
您有以下调用和结果.
>xml:get_path_s(El,[{elem,"body"},cdata]).
"JSON"
>xml:get_path_s(El,[{elem,"body"}]).
{xmlel,"body",[],[{xmlcdata,<<"JSON">>}]}
>xml:get_path_s(El,[{attr,"type"}]).
"service"
>xml:get_path_s(El,[{elem,"writer"},{elem,"name"},cdata]).
"William"
>xml:get_path_s(El,[{elem,"writer"},{attr,"id"}]).
"123"
Run Code Online (Sandbox Code Playgroud)