private DecisionTreeNode parseNode(XMLStreamReader reader, String[] labels) throws XMLStreamException {
		DecisionTreeNode result = null;
		
		//Put reader on the next node
		goToNext(reader, "node");
		
		//Leaf or not ?
		if(reader.getAttributeValue(null, "type").equals("leaf")) {
			//Create decision
			Decision d = new Decision();
			
			//Read population values
			goToNext(reader, "population");
			if(reader.getEventType() == XMLStreamConstants.START_ELEMENT
					&& reader.getLocalName().equals("population")) {
				//For each LX attribute, associate value to label in decision
				for(int i=0; i < reader.getAttributeCount(); i++) {
					int labelIndex = Integer.parseInt(reader.getAttributeLocalName(i).substring(1));
					d.addPopulation(labels[labelIndex], Integer.parseInt(reader.getAttributeValue(i)));
				}
			} else {
				throw new XMLStreamException("The given tree isn't well structured (no <population>)");
			}
			
			//Put it in result
			result = d;
			
		}
		else {
			//Create rule
			Rule r;
			
			//Read question
			goToNext(reader, "question");
			if(reader.getEventType() == XMLStreamConstants.START_ELEMENT
					&& reader.getLocalName().equals("question")) {
				//If value is numeric
				if(reader.getAttributeValue(null, "type").equals("numeric")) {
					r = new Rule(
							reader.getAttributeValue(null, "name"),
							Double.parseDouble(reader.getAttributeValue(null, "patron"))
							);
				}
				//Else (value is a string)
				else {
					r = new Rule(
							reader.getAttributeValue(null, "name"),
							reader.getAttributeValue(null, "patron")
							);
				}
			} else {
				throw new XMLStreamException("The given tree isn't well structured (no <question>)");
			}
			
			//Read population
			goToNext(reader, "population");
			
			//Read left son
			goToNext(reader, "node");
			r.setLeftSon(parseNode(reader, labels));
			
			//Read right son
			goToNext(reader, "node");
			r.setRightSon(parseNode(reader, labels));
			
			//Put it in result
			result = r;
		}
		
		return result;
	}