in src/main/java/org/apache/commons/configuration2/XMLConfiguration.java [496:535]
private Map<String, String> constructHierarchy(final ImmutableNode.Builder node, final MutableObject<String> refValue, final Element element,
final Map<ImmutableNode, Object> elemRefs, final boolean trim, final int level) {
final boolean trimFlag = shouldTrim(element, trim);
final Map<String, String> attributes = processAttributes(element);
attributes.put(ATTR_SPACE_INTERNAL, String.valueOf(trimFlag));
final StringBuilder buffer = new StringBuilder();
final NodeList list = element.getChildNodes();
boolean hasChildren = false;
for (int i = 0; i < list.getLength(); i++) {
final Node w3cNode = list.item(i);
if (w3cNode instanceof Element) {
final Element child = (Element) w3cNode;
final ImmutableNode.Builder childNode = new ImmutableNode.Builder();
childNode.name(child.getTagName());
final MutableObject<String> refChildValue = new MutableObject<>();
final Map<String, String> attrmap = constructHierarchy(childNode, refChildValue, child, elemRefs, trimFlag, level + 1);
final boolean childTrim = Boolean.parseBoolean(attrmap.remove(ATTR_SPACE_INTERNAL));
childNode.addAttributes(attrmap);
final ImmutableNode newChild = createChildNodeWithValue(node, childNode, child, refChildValue.getValue(), childTrim, attrmap, elemRefs);
if (elemRefs != null && !elemRefs.containsKey(newChild)) {
elemRefs.put(newChild, child);
}
hasChildren = true;
} else if (w3cNode instanceof Text) {
final Text data = (Text) w3cNode;
buffer.append(data.getData());
}
}
boolean childrenFlag = false;
if (hasChildren || trimFlag) {
childrenFlag = hasChildren || attributes.size() > 1;
}
final String text = determineValue(buffer.toString(), childrenFlag, trimFlag);
if (!text.isEmpty() || !childrenFlag && level != 0) {
refValue.setValue(text);
}
return attributes;
}