private void processSubContraintsAndProperties(DecisionNode<T> parent, XmlPullParser parser)
			throws XmlParseException {

		XmlElement element = parser.next();

		while (!element.isEnd()) {
			Constraint<T> constraint = readConstraint(element);
			if (constraint != null) {
				DecisionNode<T> node = parent.getOrCreateNodeForContraint(constraint);
				processSubContraintsAndProperties(node, parser);
			}
			else if (propertyNameSet.contains(element.getName())) {
				processPropertyElement(parent, element, parser);
			}
			else {
				throw new XmlParseException("Unknown element tag: " + element.getName());
			}
			element = parser.next();
		}
	}
Loads the tree from an xml constraint file. Note: this method can be called multiple times,
with each call appending to the existing tree. 
@param file the file that contains the xml for the constraint.
@throws IOException if an I/O problem occurs reading from the stream.
@throws XmlParseException if the XML is not property formatted or a tag that is not
a constraint name or property name is encountered.
Ghidra/Framework/Generic/src/main/java/generic/constraint/DecisionTree.java