首页 > 解决方案 > 使用 `xmpp` 和 `smack` 从 `vcard` 获取自定义元素

问题描述

vcard我用自定义元素创建了一个:

<vCard xmlns='vcard-temp'><NICKNAME>nickname</NICKNAME><elementName xmlns='xmlns:custom'><avatar>elementName_avatar_3.png</avatar></elementName></vCard>

但是,当我问这个时vcard,我的结果是:

<iq xmlns='jabber:client' to='602157@peropenfire101.per.local/3r6td85ng7' from='271087@peropenfire101.per.local' id='jA5pI-33' type='result'><vCard xmlns='vcard-temp'><JABBERID>271087@peropenfire101.per.local/4usgw7j7u</JABBERID><NICKNAME>nickname</NICKNAME></vCard></iq>

如您所见,缺少自定义元素。这是我的要求:

try {
        connection.sendStanzaWithResponseCallback(
                new cdcd(from),
                new StanzaFilter() {
                    @Override
                    public boolean accept(Stanza stanza) {
                        return false;
                    }
                },
                new StanzaListener() {
                    @Override
                    public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }

private class cdcd extends Stanza{

    private final Jid from;

    public cdcd(Jid from) {
        this.from = from;
    }

    @Override
    public String toString() {
        return null;
    }

    @Override
    public CharSequence toXML(String enclosingNamespace) {
        return "<iq from=\'"+ from +"\' id='v1' type='get'><vCard xmlns='vcard-temp'/></iq>";
    }
}

我不知道如何解决这个问题。

标签: androidxmppsmack

解决方案


根据XEP-054,不支持 vCard DTD 的非标准元素的特性,因此您的 XMPP 服务器忽略它们。

不幸的是,Dawson 的提议并未在 IETF 的标准流程中取得进展。由于现在在时间的迷雾中迷失的原因,Jabber 项目继续使用来自 draft-dawson-vcard-xml-dtd-01 的 DTD,进行了两项小的修改以使其适用于 Jabber 社区(添加 JABBERID 和 DESC元素),但也指定所有大写而不是小写的元素名称,如 Draft-dawson-vcard-xml-dtd-01 中定义的那样。此外,Jabber 社区遵循该草案中关于版本信息的用法(但不是 DTD),包括它作为 vCard 元素的属性而不是子元素。这种格式是在 Jabber 社区内的“vcard-temp”命名空间下实现的。

您可以在此处查看所有支持的元素。另请参阅此处的讨论


推荐阅读