in src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java [1340:1414]
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;
}