在Erlang中从XML中提取数据

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吗?

Nun*_*tas 6

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的列表,

  • {elem,StringWithTagName} - El的子标签
  • {attr,StringWithAtributeName} - El的一个属性
  • cdata - El的cdata

我将提供以下示例以便更好地理解.想象一下你的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)