Ejabberd Packet parsing using erlang -


ejabberd server receives packet this:

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

i want fetch data packet. needed data : type, if body has parameter, {<<"xml:lang">>,<<"en">>} doing following operations:

  {_xmlel, type, details , _body} = packet 

this provides me type : <<"message">> or <<"iq">> or <<"presence">>.

to check if details has {<<"xml:lang">>,<<"en">>} this:

 has_attribute=lists:member({<<"xml:lang">>,<<"en">>},details) 

is there better way this? need to , from attributes packet.

use combination of pattern matching in function head fold on details extract need.

the function below returns list of key-value tuples, <<"type">> tuple artificially created list homogenous:

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(_) -> []. 

the first clause matches {xmlel, ...} tuple, extracting type , details. return value consists of list head {<<"type">>,type} followed tail formed folding on list of keys extracted details. second clause matches not {xmlel, ...} tuple , returns empty list.

putting function module named z , passing data:

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

Comments

Popular posts from this blog

java - Date formats difference between yyyy-MM-dd'T'HH:mm:ss and yyyy-MM-dd'T'HH:mm:ssXXX -

c# - Get rid of xmlns attribute when adding node to existing xml -