Providers are responsible for parsing the XMPP XML stream into new Java objects.
When implementing a provider, follow these patterns:
- Use a
while(true) loop with a labeled break (e.g., outerloop:) to handle the parsing lifecycle. - Use
switch/case on XmlPullParser.Event (integers) for the main loop and switch/case on element names (Strings) for sub-elements. - Use
XmlPullParser.nextText() only when an element is required to have text. - Use
ParserUtils to parse Java primitives (e.g., ParserUtils.getBooleanAttribute, ParserUtils.getIntegerAttribute). - Design the resulting classes to be as immutable as possible.
Common Pitfall: Use a long instead of int when the XML schema specifies xs:unsignedInt, as Java's int range is too small for this type.
public MyExtension parse(XmlPullParser parser, int initialDepth) {
MyElement myElement = null;
MyInfo myInfo = null;
String attrFoo = parser.getAttributeValue("", "attrFoo");
outerloop: while(true) {
XmlPullParser.Event event = parser.next();
switch (event) {
case START_ELEMENT:
String name = parser.getName();
switch(name) {
case "myElement":
myElement = new MyElement(parser.nextText());
break;
case "myInfo":
boolean alpha = ParserUtils.getBooleanAttribute(parser, "alpha");
int delta = ParserUtils.getIntegerAttribute(parser, "delta");
myInfo = new MyInfo(alpha, delta);
break;
}
break;
case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
default:
break;
}
}
return new MyExtension(attrFoo, myElement, myInfo);
}