簡體   English   中英

XMPP:如何解析XMPPMessage元素

[英]XMPP: How to parse XMPPMessage element

對於來自xmpp的每條消息,我都獲得以下xml格式

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

在控制台上打印

<message
    xmlns="jabber:client" from="10000006956@xmpp-dev.peeks.com" to="10000006956@xmpp-dev.peeks.com/mobile">
    <result
        xmlns="urn:xmpp:mam:tmp" id="1483781596098940">
        <forwarded
            xmlns="urn:xmpp:forward:0">
            <message
                xmlns="jabber:client" from="10000006931@xmpp-dev.peeks.com/mobile" to="10000006956@xmpp-dev.peeks.com" 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)

修復了搜索屬性的問題:元素是節點(例如Body,Result等),而其他元素只是先前元素的屬性。

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];

快速5:

func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
        if let msg = message.body {
            if let from = message.attribute(forName: "from")?.stringValue{
                print("msg: \(msg), \(from)")
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM