/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.util; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * Simple class to read information from small XML using DOM manipulation * * @author Andrea Bollini * */ public class XMLUtils { /** * * @param dataRoot * the starting node * @param name * the name of the subelement to find * @return the list of all DOM Element with the provided name direct child * of the starting node */ public static List<Element> getElementList(Element dataRoot, String name) { NodeList list = dataRoot.getElementsByTagName(name); List<Element> listElements = new ArrayList<Element>(); for (int i = 0; i < list.getLength(); i++) { Element item = (Element) list.item(i); if (item.getParentNode().equals(dataRoot)) { listElements.add(item); } } return listElements; } /** * * @param dataRoot * the starting node * @param name * the name of the sub element * @param attr * the attribute to get * @return the value of the attribute for the sub element with the specified * name in the starting node */ public static String getElementAttribute(Element dataRoot, String name, String attr) { Element element = getSingleElement(dataRoot, name); String attrValue = null; if (element != null) { attrValue = element.getAttribute(attr); if (StringUtils.isNotBlank(attrValue)) { attrValue = attrValue.trim(); } else attrValue = null; } return attrValue; } /** * * @param dataRoot * the starting node * @param name * the name of the sub element * @return the text content of the sub element with the specified name in * the starting node */ public static String getElementValue(Element dataRoot, String name) { Element element = getSingleElement(dataRoot, name); String elementValue = null; if (element != null) { elementValue = element.getTextContent(); if (StringUtils.isNotBlank(elementValue)) { elementValue = elementValue.trim(); } else elementValue = null; } return elementValue; } /** * Return the first element child with the specified name * * @param dataRoot * the starting node * @param name * the name of sub element to look for * @return the first child element or null if no present */ public static Element getSingleElement(Element dataRoot, String name) { List<Element> nodeList = getElementList(dataRoot, name); Element element = null; if (nodeList != null && nodeList.size() > 0) { element = (Element) nodeList.get(0); } return element; } /** * * @param rootElement * the starting node * @param subElementName * the name of the subelement to find * @return a list of string including all the text contents of the sub * element with the specified name. If there are not sub element * with the supplied name the method will return null */ public static List<String> getElementValueList(Element rootElement, String subElementName) { if (rootElement == null) return null; List<Element> subElements = getElementList(rootElement, subElementName); if (subElements == null) return null; List<String> result = new LinkedList<String>(); for (Element el : subElements) { if (StringUtils.isNotBlank(el.getTextContent())) { result.add(el.getTextContent().trim()); } } return result; } /** * root/subElement[]/field1, field2, fieldN * * @param rootElement * the starting node * @param subElementName * the name of the sub element to work on * @param fieldsName * the names of the sub-sub-elements from which get the text * content * @return a list of array strings. The length of the array is equals to the * number of fields required. For any fields the first textual value * found in the sub element is used, null if no value is present */ public static List<String[]> getElementValueArrayList(Element rootElement, String subElementName, String... fieldsName) { if (rootElement == null) return null; List<Element> subElements = getElementList(rootElement, subElementName); if (subElements == null) return null; List<String[]> result = new LinkedList<String[]>(); for (Element el : subElements) { String[] tmp = new String[fieldsName.length]; for (int idx = 0; idx < fieldsName.length; idx++) { tmp[idx] = XMLUtils.getElementValue(el, fieldsName[idx]); } result.add(tmp); } return result; } }