2017-01-10 3 views
0

Я получаю следующий формат XML для каждого входящего сообщения от XMPPXMPP: Как разобрать XMPPMessage элемент

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message 
{ 
NSLog(@"Message %@",message);   
} 

В консоли его печати

<message 
    xmlns="jabber:client" from="[email protected]" to="[email protected]/mobile"> 
    <result 
     xmlns="urn:xmpp:mam:tmp" id="1483781596098940"> 
     <forwarded 
      xmlns="urn:xmpp:forward:0"> 
      <message 
       xmlns="jabber:client" from="[email protected]/mobile" to="[email protected]" type="chat"> 
       <body>Hi</body> 
       <delay 
        xmlns="urn:xmpp:delay" from="xmpp-dev.peeks.com" stamp="2016-12-22T04:50:17.023Z">Offline Storage 
       </delay> 
      </message> 
      <delay 
       xmlns="urn:xmpp:delay" from="xmpp-dev.peeks.com" stamp="2017-01-07T09:33:16.099Z"> 
      </delay> 
     </forwarded> 
    </result> 
</message> 

Я хочу получать «от», «в», «тело» и «печать» из каждого сообщения и я сделал следующий

NSXMLElement *body = message; 
    NSXMLElement *messageb = [body elementForName:@"result" xmlns:@"urn:xmpp:mam:tmp"]; 
    NSXMLElement *forwa=[messageb elementForName:@"forwarded" xmlns:@"urn:xmpp:forward:0"]; 
    NSXMLElement *msg=[forwa elementForName:@"message" xmlns:@"jabber:client"]; 
    NSXMLElement *TD=[forwa elementForName:@"delay" xmlns:@"urn:xmpp:delay"]; 

    NSString *from=[[msg elementForName:@"from" xmlns:@"jabber:client"] stringValue]; 
    NSString *to=[[msg elementForName:@"to" xmlns:@"jabber:client"] stringValue]; 
    NSString *bodyq=[[msg elementForName:@"body"] stringValue]; 
    NSString *stmp=[[TD elementForName:@"stamp" xmlns:@"urn:xmpp:delay"] stringValue]; 
    NSString *final=[NSString stringWithFormat:@"From: %@\nTo: %@\nBody: %@\nStamp: %@",from,to,bodyq,stmp]; 
    NSLog(@"forwa %@", final); 

я могу в состоянии напечатать только тело сообщения и журнал печатает как

From: (null) 
To: (null) 
Body: hi 
Stamp: (null) 

ответ

1

Фикс для поиска атрибутов: элементы являются узлами (например, Body, результат и т.д.) в то время как другие только атрибуты предыдущих элементов.

NSString *from=[[msg attributeForName:@"from"] stringValue]; 
    NSString *to=[[msg attributeForName:@"to"] stringValue]; 
    NSString *stmp=[[TD attributeForName:@"stamp"] stringValue]; 

Отредактировано (извините, моя последняя работа с ObjectiveC действительно старая).

xml namespace его о element и не attributes.

Если вы не получите снова, попробуйте проходя мимо NSXMLNode

NSXMLNode *fromNode = [msg attributeForName:@"from"]; 
NSString *from = [fromNode stringValue]; 
+0

его погрешность дает никаких видимых @interface для 'DDXMLElement' не декларирует селектор 'attributeForName: Xmlns:' –

+2

просто удалены Xmlns: @ "болтовни : клиент "из каждой строки, тогда его работало прекрасное обновление ur ответ toooo –

+0

да, моя ошибка :) Была редактирование :) TY – MrPk

Смежные вопросы