首先需要两个类
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());