private static Element readElement()

in src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java [2137:2211]


    private static Element readElement(final XMLStreamReader reader)
            throws XMLStreamException {

        // Create a document in which to build the DOM node
        Document document;
        try {
            document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        } catch (final ParserConfigurationException pce) {
            throw new XMLStreamException(ERR_PARSER_CFG);
        }

        // This root element will be returned, add any attributes as specified
        final Element root = document.createElementNS(reader.getNamespaceURI(), createQualifiedName(reader.getPrefix(), reader.getLocalName()));
        document.appendChild(root);

        boolean children = false, cdata = false;
        Node parent = root;

        // Convert stream to DOM node(s) while maintaining parent child relationships
        loop : while (reader.hasNext()) {
            Node child = null;
            switch (reader.next()) {
                case XMLStreamConstants.START_ELEMENT:
                    if (!children && root.hasChildNodes()) {
                        // remove any children
                        root.setTextContent(null);
                    }
                    children = true;
                    final Element elem = document.createElementNS(reader.getNamespaceURI(),
                            createQualifiedName(reader.getPrefix(), reader.getLocalName()));
                    for (int i = 0; i < reader.getAttributeCount(); i++) {
                        final Attr attr = document.createAttributeNS(reader.getAttributeNamespace(i),
                                createQualifiedName(reader.getAttributePrefix(i), reader.getAttributeLocalName(i)));
                        attr.setValue(reader.getAttributeValue(i));
                        elem.setAttributeNodeNS(attr);
                    }
                    parent.appendChild(elem);
                    parent = elem;
                    break;
                case XMLStreamConstants.SPACE:
                case XMLStreamConstants.CHARACTERS:
                case XMLStreamConstants.ENTITY_REFERENCE:
                    if (!children || parent != root) {
                        child = document.createTextNode(reader.getText());
                    }
                    break;
                case XMLStreamConstants.CDATA:
                    if (!children || parent != root) {
                        cdata = true;
                        child = document.createCDATASection(reader.getText());
                    }
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    parent = parent.getParentNode();
                    if (parent == document) {
                        break loop;
                    }
                    break;
                default: // rest is ignored
            }
            if (child != null) {
                parent.appendChild(child);
            }
        }
        if (!children && root.hasChildNodes() && root.getChildNodes().getLength() > 1) {
            final String text = root.getTextContent().trim();
            if (!cdata) {
                root.setTextContent(text);
            } else {
                root.setTextContent(null);
                root.appendChild(document.createCDATASection(text));
            }
        }
        return root;
    }