diff --git a/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java b/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java
index aabd4cb2f..833392a43 100644
--- a/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java
+++ b/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java
@@ -24,53 +24,85 @@ import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace;
import org.xmlpull.v1.XmlPullParser;
/**
- * Parses an item element as is defined in both the {@link PubSubNamespace#BASIC} and {@link PubSubNamespace#EVENT}
- * namespaces. To parse the item contents, it will use whatever {@link PacketExtensionProvider} is registered in
- * smack.providers for its element name and namespace. If no provider is registered, it will return a {@link SimplePayload}.
+ * Parses an item element as is defined in both the {@link PubSubNamespace#BASIC} and
+ * {@link PubSubNamespace#EVENT} namespaces. To parse the item contents, it will use whatever
+ * {@link PacketExtensionProvider} is registered in smack.providers for its element name and namespace. If no
+ * provider is registered, it will return a {@link SimplePayload}.
*
* @author Robin Collier
*/
-public class ItemProvider implements PacketExtensionProvider
+public class ItemProvider implements PacketExtensionProvider
{
- public PacketExtension parseExtension(XmlPullParser parser) throws Exception
- {
- String id = parser.getAttributeValue(null, "id");
+ public PacketExtension parseExtension(XmlPullParser parser) throws Exception
+ {
+ String id = parser.getAttributeValue(null, "id");
String node = parser.getAttributeValue(null, "node");
- String elem = parser.getName();
-
- int tag = parser.next();
-
- if (tag == XmlPullParser.END_TAG)
- {
- return new Item(id, node);
- }
- else
- {
- String payloadElemName = parser.getName();
- String payloadNS = parser.getNamespace();
-
- if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null)
- {
- boolean done = false;
- StringBuilder payloadText = new StringBuilder();
-
- while (!done)
- {
- if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem))
- done = true;
- else if (!((tag == XmlPullParser.START_TAG) && parser.isEmptyElementTag()))
- payloadText.append(parser.getText());
-
- if (!done)
- tag = parser.next();
- }
- return new PayloadItem(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString()));
- }
- else
- {
- return new PayloadItem(id, node, PacketParserUtils.parsePacketExtension(payloadElemName, payloadNS, parser));
- }
- }
- }
+ String elem = parser.getName();
+
+ int tag = parser.next();
+
+ if (tag == XmlPullParser.END_TAG)
+ {
+ return new Item(id, node);
+ }
+ else
+ {
+ String payloadElemName = parser.getName();
+ String payloadNS = parser.getNamespace();
+
+ if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null)
+ {
+ boolean done = false;
+ StringBuilder payloadText = new StringBuilder();
+
+ while (!done)
+ {
+ if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem))
+ {
+ done = true;
+ }
+ else if (parser.getEventType() == XmlPullParser.START_TAG)
+ {
+ payloadText.append("<").append(parser.getName());
+
+ if (parser.getName().equals(payloadElemName) && (!payloadNS.isEmpty()))
+ payloadText.append(" xmlns=\"").append(payloadNS).append("\"");
+ int n = parser.getAttributeCount();
+
+ for (int i = 0; i < n; i++)
+ payloadText.append(" ").append(parser.getAttributeName(i)).append("=\"")
+ .append(parser.getAttributeValue(i)).append("\"");
+
+ if (parser.isEmptyElementTag())
+ {
+ payloadText.append("/>");
+ done = true;
+ }
+ else
+ {
+ payloadText.append(">");
+ }
+ }
+ else if (parser.getEventType() == XmlPullParser.END_TAG)
+ {
+ if (done)
+ done = false;
+ else
+ payloadText.append("").append(parser.getName()).append(">");
+ }
+ else if (parser.getEventType() == XmlPullParser.TEXT)
+ {
+ payloadText.append(parser.getText());
+ }
+ tag = parser.next();
+ }
+ return new PayloadItem(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString()));
+ }
+ else {
+ return new PayloadItem(id, node, PacketParserUtils.parsePacketExtension(
+ payloadElemName, payloadNS, parser));
+ }
+ }
+ }
}