【问题标题】:Ejabberd Packet parsing using erlang使用erlang解析Ejabberd数据包
【发布时间】:2015-12-17 23:39:16
【问题描述】:

Ejabberd 服务器收到这样的数据包:

  {xmlel,<<"message">>,[{<<"from">>,<<"user1@localhost/resource">>},{<<"to">>,<<"user2@localhost">>},{<<"xml:lang">>,<<"en">>},{<<"id">>,<<"947yW-9">>}],[{xmlcdata,<<">">>},{xmlel,<<"body">>,[],[{xmlcdata,<<"Helllo wassup!">>}]}]}

我想从这个数据包中获取数据。 需要的数据:类型,如果body有某个参数,比如{&lt;&lt;"xml:lang"&gt;&gt;,&lt;&lt;"en"&gt;&gt;} 我正在做以下操作:

  {_XMLEL, TYPE, DETAILS , _BODY} = Packet

这为我提供了类型:&lt;&lt;"message"&gt;&gt;&lt;&lt;"iq"&gt;&gt;&lt;&lt;"presence"&gt;&gt;

要检查 DETAILS 是否有 {&lt;&lt;"xml:lang"&gt;&gt;,&lt;&lt;"en"&gt;&gt;} 我这样做:

 Has_Attribute=lists:member({<<"xml:lang">>,<<"en">>},DETAILS)

有没有更好的方法来做到这一点? 我还需要数据包中的tofrom 属性。

【问题讨论】:

    标签: erlang ejabberd


    【解决方案1】:

    结合使用函数头中的模式匹配以及折叠细节来提取您需要的一切。

    下面的函数返回一个键值元组列表,其中&lt;&lt;"type"&gt;&gt;元组是人为创建的,所以列表是同质的:

    extract({xmlel, Type, Details, _}) ->
        [{<<"type">>,Type} |
         lists:foldl(fun(Key, Acc) ->
                             case lists:keyfind(Key, 1, Details) of
                                 false -> Acc;
                                 Pair -> [Pair|Acc]
                             end
                     end, [], [<<"from">>,<<"to">>,<<"xml:lang">>])];
    extract(_) -> [].
    

    第一个子句匹配{xmlel, ...} 元组,提取TypeDetails。返回值由一个带有头部{&lt;&lt;"type"&gt;&gt;,Type} 的列表和一个尾部组成,该尾部是通过折叠要从Details 中提取的键列表形成的。第二个子句匹配任何不是{xmlel, ...} 元组的东西,只返回空列表。

    将此函数放入名为z 的模块中并将您的数据传递给它:

    1> z:extract({xzlel,<<"message">>,[{<<"from">>,<<"user1@localhost/resource">>},{<<"to">>,<<"user2@localhost">>},{<<"xml:lang">>,<<"en">>},{<<"id">>,<<"947yW-9">>}],[{xmlcdata,<<">">>},{xmlel,<<"body">>,[],[{xmlcdata,<<"Helllo wassup!">>}]}]}).
    [{<<"type">>,<<"message">>},
     {<<"xml:lang">>,<<"en">>},
     {<<"to">>,<<"user2@localhost">>},
     {<<"from">>,<<"user1@localhost/resource">>}]
    

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 2020-06-27
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多