public static XppDom build()

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;
    }