mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2025-09-09 10:19:41 +02:00
Improve parseContent() and parseContentDepth()
The idea is that xml-roundtrip should *never* be expected from a XmlPullParser. So what we need is a method that parses the content of an element without relying on getText() returning text if on START_TAG or END_TAG. This is already done by PubSubs ItemProvider. Also add PacketParserUtils.parseElement() which will return the current element as String and use this method in PubSub's ItemProvider.
This commit is contained in:
parent
26b5bc0212
commit
56222d6ee2
8 changed files with 201 additions and 117 deletions
|
@ -30,11 +30,11 @@ import java.util.logging.Logger;
|
|||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smack.provider.IQProvider;
|
||||
import org.jivesoftware.smack.util.Base32Encoder;
|
||||
import org.jivesoftware.smack.util.PacketParserUtils;
|
||||
import org.jivesoftware.smack.util.StringEncoder;
|
||||
import org.jivesoftware.smackx.caps.EntityCapsManager;
|
||||
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
|
||||
import org.jivesoftware.smackx.disco.provider.DiscoverInfoProvider;
|
||||
import org.xmlpull.v1.XmlPullParserFactory;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
|
@ -159,8 +159,7 @@ public class SimpleDirectoryPersistentCache implements EntityCapsPersistentCache
|
|||
Reader reader = new StringReader(fileContent);
|
||||
XmlPullParser parser;
|
||||
try {
|
||||
parser = XmlPullParserFactory.newInstance().newPullParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
||||
parser = PacketParserUtils.newXmppParser();
|
||||
parser.setInput(reader);
|
||||
} catch (XmlPullParserException xppe) {
|
||||
LOGGER.log(Level.SEVERE, "Exception initializing parser", xppe);
|
||||
|
|
|
@ -20,7 +20,6 @@ import org.jivesoftware.smack.packet.PacketExtension;
|
|||
import org.jivesoftware.smack.provider.PacketExtensionProvider;
|
||||
import org.jivesoftware.smack.provider.ProviderManager;
|
||||
import org.jivesoftware.smack.util.PacketParserUtils;
|
||||
import org.jivesoftware.smack.util.StringUtils;
|
||||
import org.jivesoftware.smackx.pubsub.Item;
|
||||
import org.jivesoftware.smackx.pubsub.PayloadItem;
|
||||
import org.jivesoftware.smackx.pubsub.SimplePayload;
|
||||
|
@ -41,7 +40,6 @@ public class ItemProvider implements PacketExtensionProvider
|
|||
{
|
||||
String id = parser.getAttributeValue(null, "id");
|
||||
String node = parser.getAttributeValue(null, "node");
|
||||
String elem = parser.getName();
|
||||
|
||||
int tag = parser.next();
|
||||
|
||||
|
@ -56,57 +54,8 @@ public class ItemProvider implements PacketExtensionProvider
|
|||
|
||||
if (ProviderManager.getExtensionProvider(payloadElemName, payloadNS) == null)
|
||||
{
|
||||
boolean done = false;
|
||||
boolean isEmptyElement = false;
|
||||
StringBuilder payloadText = new StringBuilder();
|
||||
|
||||
while (!done)
|
||||
{
|
||||
if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem))
|
||||
{
|
||||
done = true;
|
||||
continue;
|
||||
}
|
||||
else if (parser.getEventType() == XmlPullParser.START_TAG)
|
||||
{
|
||||
payloadText.append("<").append(parser.getName());
|
||||
|
||||
if (parser.getName().equals(payloadElemName) && (payloadNS.length() > 0))
|
||||
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("/>");
|
||||
isEmptyElement = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
payloadText.append(">");
|
||||
}
|
||||
}
|
||||
else if (parser.getEventType() == XmlPullParser.END_TAG)
|
||||
{
|
||||
if (isEmptyElement)
|
||||
{
|
||||
isEmptyElement = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
payloadText.append("</").append(parser.getName()).append(">");
|
||||
}
|
||||
}
|
||||
else if (parser.getEventType() == XmlPullParser.TEXT)
|
||||
{
|
||||
payloadText.append(StringUtils.escapeForXML(parser.getText()));
|
||||
}
|
||||
tag = parser.next();
|
||||
}
|
||||
return new PayloadItem<SimplePayload>(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString()));
|
||||
String payloadText = PacketParserUtils.parseElement(parser);
|
||||
return new PayloadItem<SimplePayload>(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue