android - 如何在 ASMACK 中解析 CustomIQ

标签 android asmack

我正在为我的应用程序使用 ASMACK 库。我从我的服务器收到以下 IQ。

<iq id='bind_2' type='result'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid username='xx' fullname='yy'><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="790101391818571b1b571a1a571d1d" rel="noreferrer noopener nofollow">[email protected]</a>/Resource</jid></bind></iq>

为了解析此 IQ,我在使用 ProviderManager 类设置 XmppConnection 配置时添加了 IQProvider

ProviderManager.getInstance().addIQProvider("bind",
                        "urn:ietf:params:xml:ns:xmpp-bind",
                        new CustomIQProvider());

我的CustomIQProvider类是

public class CustomIQProvider implements IQProvider {
    public static final String NAME_SPACE = "urn:ietf:params:xml:ns:xmpp-bind";

    @Override
    public IQ parseIQ(XmlPullParser parser) throws Exception {

        Log.i("My_TAG", "inside LivBindIQ");
        CustomIQ bindIQ = new CustomIQ();
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException(
                    "Parser not in proper position, or bad XML.");
        }
        boolean done = false;

        while (!done) {
            int eventType = parser.next();
            if ((eventType == XmlPullParser.START_TAG)
                    && ("entry".equals(parser.getName()))) {
                eventType = parser.next();
                String name = parser.nextText();
                eventType = parser.next();
                String value = parser.nextText();
            }
            else if (eventType == XmlPullParser.END_TAG) {
                done = true;
            }
        }

        return bindIQ;

    }

}

我的CustomIQ类(class)是,

public class CustomIQ extends IQ {

    @Override
    public String getChildElementXML() {
        // TODO Auto-generated method stub
        return null;
    }

    }

现在我对如何执行 CustomIQProvider 类感到困惑。我没有从 CustomIQProvider 类获得任何日志。我的步骤是否正确,否则我需要执行任何步骤来调用我的 CustomIQProvider

最佳答案

也许已经有一个提供者注册了这个命名空间? 也许您需要在 IQProvider 上对 XML 进行完整且正确的解析,并且您的 CustomIQ 还需要实现 xml 的正确输出。 您正在检查一个标签,但显然它不存在,因此该解析器将永远无法工作。 假设这是您要解析的标签

<jid username='xx' fullname='yy'><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2dadae2c3c38cc0c08cc1c18cc6c6" rel="noreferrer noopener nofollow">[email protected]</a>/Resource</jid>

我没有测试过,但这应该有效,你的 parseIQ 方法应该如下所示

public IQ parseIQ(XmlPullParser parser) throws Exception {
  CustomIQ bindIQ = new CustomIQ();
  while (!done) {
    int eventType = parser.next();
    if (eventType == XmlPullParser.START_TAG) {
        if (parser.getName().equals("jid")) {
            String username = parser.getAttributeValue("", "username");
            String fullname = parser.getAttributeValue("", "fullname");
            String jidValue = parser.nextText();

            bindIQ.setUsername(username);
            bindIQ.setFullname(fullname);
            bindIQ.setFullJid(jidValue);
        }
    }
    else if (eventType == XmlPullParser.END_TAG) {
        if (parser.getName().equals("jid")) {
            done = true;
        }
    }
  }
  return bindIQ;
}

以及您的 CustomIQ 类:

public class CustomIQ extends IQ {

  private String username;
  private String fullName;
  private String fullJid;

  public CustomIQ() {

  }

  public void setUsername(String username) {
      this.username = username;
  }

  public void setFullname(String fullName) {
      this.fullName = fullName;
  }

  public void setFullJid(String fullJid) {
      this.fullJid = fullJid;
  }

  public String getUsername() {
      return this.username;
  }

  public String getFullname() {
      return this.fullName;
  }

  public String getFullJid() {
      return this.fullJid;
  }

  @Override
  public String getChildElementXML() {
      StringBuilder builder = new StringBuilder("<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"><jid username=\"");
      builder.append(username).append("\"");
      builder.append(" fullname=\"");
      builder.append(fullName).append("\"");
      builder.append(">");
      builder.append(fullJid);
      builder.append("</jid>");
      builder.append("</bind>");
      return builder.toString();
  }

}

关于android - 如何在 ASMACK 中解析 CustomIQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566411/

相关文章:

java - 具有不同 getters setter 的未知子类型的通用配置

android - 当 TextView 中有多于一行输出时,Text 会触及 Parent 的开头

android - 在 Windows 上构建 asmack

android 实现xmppconnection服务

android - 如何使用 asmack android 从 Openfire 检索一对一的聊天记录

java - Android XMPP 连接不是持久的 - asmack 库甚至在单独的线程中运行

Android - 从 ListView 中删除项目时的动画

android - AsyncTask有时会崩溃

Java:从 UTF8 字符串创建 Drawable

android - 使用 Jabber ID 的 Facebook 连接