首先需要两个类
import org.jivesoftware.smack.packet.PacketExtension; public class XtalkMessage implements PacketExtension { private StringBuffer packetContent = null; public static final String ELEMENT_NAME="xtalk"; public static final String NAME_SPACE="urn:xmpp:xtalk:dd"; public StringBuffer getPacketContent() { return packetContent; } public void setPacketContent(StringBuffer packetContent) { this.packetContent = packetContent; } @Override public String getElementName() { // TODO Auto-generated method stub return ELEMENT_NAME; } @Override public String getNamespace() { // TODO Auto-generated method stub return NAME_SPACE; } @Override public String toXML() { // TODO Auto-generated method stub return packetContent.toString(); } }
import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.jivesoftware.smack.util.StringUtils; import org.xmlpull.v1.XmlPullParser; public class XtalkMessageProvider implements PacketExtensionProvider { public XtalkMessageProvider() { } public PacketExtension parseExtension(XmlPullParser parser) throws Exception { XtalkMessage messageEvent = new XtalkMessage(); StringBuffer buffer = new StringBuffer(); boolean done = false; int oldNsCount = 0; oldNsCount = parser.getNamespaceCount(parser.getDepth()); while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { buffer.append('<' + parser.getName()); int ns = parser.getNamespaceCount(parser.getDepth()); for (int i = oldNsCount; i < ns; i++) { if (parser.getNamespacePrefix(i) != null) { buffer.append(" xmlns:") .append(parser.getNamespacePrefix(i)) .append("=\"") .append(parser.getNamespaceUri(i)).append("\""); } else { buffer.append(" xmlns=\"") .append(parser.getNamespaceUri(i)).append("\""); } } oldNsCount = ns; for (int i = 0; i < parser.getAttributeCount(); i++) { buffer.append(" ").append(parser.getAttributeName(i)) .append("="); buffer.append("\"").append(parser.getAttributeValue(i)) .append("\""); } buffer.append('>'); } else if (eventType == XmlPullParser.TEXT) { // System.out.println("XmlPullParser.TEXT:" // + StringUtils.escapeForXML(parser.getText())); //buffer.append(StringUtils.escapeForXML(parser.getText())); buffer.append(parser.getText()); } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals(XtalkMessage.ELEMENT_NAME)) { done = true; } else { buffer.append("</" + parser.getName() + '>'); } } } // System.out.println(TAG + " PacketExtension:" + buffer.toString()); messageEvent.setPacketContent(buffer); return messageEvent; } }
在主程序中调用如下
ProviderManager.getInstance().addExtensionProvider( XtalkMessage.ELEMENT_NAME, XtalkMessage.NAME_SPACE, new XtalkMessageProvider());