in xstream/src/java/com/thoughtworks/xstream/io/xml/xppdom/XppDom.java [180:234]
public static XppDom build(final XmlPullParser parser) throws XmlPullParserException, IOException {
final List<XppDom> elements = new ArrayList<>();
final List<StringBuilder> values = new ArrayList<>();
XppDom node = null;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
final String rawName = parser.getName();
// Use XppDom when deprecated Xpp3Dom is removed
final XppDom child = new Xpp3Dom(rawName);
final int depth = elements.size();
if (depth > 0) {
final XppDom parent = elements.get(depth - 1);
parent.addChild(child);
}
elements.add(child);
values.add(new StringBuilder());
final int attributesSize = parser.getAttributeCount();
for (int i = 0; i < attributesSize; i++) {
final String name = parser.getAttributeName(i);
final String value = parser.getAttributeValue(i);
child.setAttribute(name, value);
}
} else if (eventType == XmlPullParser.TEXT) {
final int depth = values.size() - 1;
final StringBuilder valueBuffer = values.get(depth);
valueBuffer.append(parser.getText());
} else if (eventType == XmlPullParser.END_TAG) {
final int depth = elements.size() - 1;
final XppDom finalNode = elements.remove(depth);
final String accumulatedValue = values.remove(depth).toString();
String finishedValue;
if (0 == accumulatedValue.length()) {
finishedValue = null;
} else {
finishedValue = accumulatedValue;
}
finalNode.setValue(finishedValue);
if (0 == depth) {
node = finalNode;
}
}
eventType = parser.next();
}
return node;
}