private static void populateRecursively(ArrayList<String> exclusions,
			ArrayList<String> ignoreList, ArrayList<String> concatenations,
			Node node, String concatenation) {
		NodeList childs = node.getChildNodes();
		for (int i = 0; i < childs.getLength(); i++) {
			Node child = childs.item(i);
			if (exclusions.contains(child.getNodeName()))
				continue;
			if (child.getNodeName().equals("taxonPath")) {
				Element sourceElem = null;
				Element stringElem = null;
				Element taxonElem = null;
				Element idElem = null;
				String source;
				String id;
				try {
					sourceElem = (Element) ((Element) child)
							.getElementsByTagName("source").item(0);
					stringElem = (Element) (sourceElem
							.getElementsByTagName("string").item(0));
					source = stringElem.getTextContent();
					taxonElem = (Element) ((Element) child)
							.getElementsByTagName("taxon").item(0);
					idElem = (Element) (taxonElem.getElementsByTagName("id")
							.item(0));
					id = idElem.getTextContent();
					String result = concatenation + "/" + source + "/" + id;
					concatenations.add(result);
				} catch (Exception e) {
					// TODO: handle exception
				}

			} else if (child.hasChildNodes()) {
				String segment = ((Element) child).getTagName();
				if (!(ignoreList.contains(segment)))
					segment = concatenation + "/" + segment.toLowerCase();
				else
					segment = concatenation;
				populateRecursively(exclusions, ignoreList, concatenations,
						child, segment);
			} else {
				String textContent = child.getTextContent();
				if (StringUtils.isBlank(textContent))
					continue;
				if (exclusions.contains(textContent))
					continue;
				String result;
				try {
					result = concatenation
							+ "/"
							+ URLEncoder.encode(textContent.toLowerCase(),
									"UTF-8");
					concatenations.add(result);
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}

			}

		}

	}