2015-09-21 7 views
1
сервера

Ejabberd получает пакет, как это:Ejabberd Packet разбора с использованием Erlang

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

Я хочу, чтобы получить данные из этого пакета. Необходимые данные: тип, если тело имеет определенный параметр, скажем {<<"xml:lang">>,<<"en">>} я делаю следующие операции:

{_XMLEL, TYPE, DETAILS , _BODY} = Packet 

Это дает мне тип: <<"message">> или <<"iq">> или <<"presence">>.

Чтобы проверить, если ПОДРОБНОСТИ имеет {<<"xml:lang">>,<<"en">>} я это сделать:

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

Есть ли лучший способ сделать это? Мне также нужны атрибуты to и from из пакета.

ответ

2

Используйте комбинацию соответствия шаблону в функциональной голове вместе со сгибом по деталям, чтобы извлечь все, что вам нужно.

Функция ниже возвращает список ключей и значений кортежей, где <<"type">> кортеж искусственно созданных таким образом список является однородным:

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, ...} кортеж, извлекая Type и Details. Возвращаемое значение состоит из списка с головкой {<<"type">>,Type}, за которым следует хвост, сформированный из сгибания по списку ключей, которые должны быть извлечены из Details. Второе предложение сопоставляет ничего, кроме кортежа {xmlel, ...}, и просто возвращает пустой список.

Положив эту функцию в модуль с именем z и передавая ему свои данные:

1> z:extract({xzlel,<<"message">>,[{<<"from">>,<<"[email protected]/resource">>},{<<"to">>,<<"[email protected]">>},{<<"xml:lang">>,<<"en">>},{<<"id">>,<<"947yW-9">>}],[{xmlcdata,<<">">>},{xmlel,<<"body">>,[],[{xmlcdata,<<"Helllo wassup!">>}]}]}). 
[{<<"type">>,<<"message">>}, 
{<<"xml:lang">>,<<"en">>}, 
{<<"to">>,<<"[email protected]">>}, 
{<<"from">>,<<"[email protected]/resource">>}] 
Смежные вопросы