在Erlang中从XML中提取数据

时间:2014-07-17 11:34:54

标签: xml erlang ejabberd

我有这个XML:

<message from="adminhash@localhost/xmpphp2" to="queue@springfruitdev"
type="service" id="service1"><body>JSON</body></message>

我想在标签之间提取文字。

以下是如何在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)))).

结果:

{xmlel,<<"body">>,[],[{xmlcdata,<<"JSON">>}]}

首先,我能以更优雅的方式提取xmlcdata吗?

2 个答案:

答案 0 :(得分:6)

xml.erl中的另一个选项是函数

  

的xml:get_path_s / 2

<强> TL; DR;

获取body cdata,您将使用以下

>xml:get_path_s(El,[{elem,"body"},cdata]).
"JSON"

更多数据

你提供的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>

您有以下调用和结果。

>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"

答案 1 :(得分:3)

您可以使用xml.erl中的一些功能:

> xml:get_tag_cdata(xml:get_subtag(X, <<"body">>)).
<<"JSON">>

即,获取body子元素,然后从中获取所有字符数据。