/**
* 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.authority.util;
import org.apache.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
/**
*
* @author Antoine Snyers (antoine at atmire.com)
* @author Kevin Van de Velde (kevin at atmire dot com)
* @author Ben Bosman (ben at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
*/
public class XMLUtils {
/**
* log4j logger
*/
private static Logger log = Logger.getLogger(XMLUtils.class);
/**
* @param xml The starting context (a Node or a Document, for example).
* @param singleNodeXPath xpath
* @return node.getTextContent() on the node that matches singleNodeXPath
* null if nothing matches the NodeListXPath
* @throws XPathExpressionException if xpath error
*/
public static String getTextContent(Node xml, String singleNodeXPath) throws XPathExpressionException {
String text = null;
Node node = getNode(xml, singleNodeXPath);
if (node != null) {
text = node.getTextContent();
}
return text;
}
/**
* @param xml The starting context (a Node or a Document, for example).
* @param NodeListXPath xpath
* @return A Node matches the NodeListXPath
* null if nothing matches the NodeListXPath
* @throws XPathExpressionException if xpath error
*/
public static Node getNode(Node xml, String NodeListXPath) throws XPathExpressionException {
Node result = null;
try {
result = XPathAPI.selectSingleNode(xml, NodeListXPath);
} catch (TransformerException e) {
log.error("Error", e);
}
return result;
}
/**
* @param xml The starting context (a Node or a Document, for example).
* @param NodeListXPath xpath
* @return A NodeList containing the nodes that match the NodeListXPath
* null if nothing matches the NodeListXPath
* @throws XPathExpressionException if xpath error
*/
public static NodeList getNodeList(Node xml, String NodeListXPath) throws XPathExpressionException {
NodeList nodeList = null;
try {
nodeList = XPathAPI.selectNodeList(xml, NodeListXPath);
} catch (TransformerException e) {
log.error("Error", e);
}
return nodeList;
}
public static Iterator<Node> getNodeListIterator(Node xml, String NodeListXPath) throws XPathExpressionException {
return getNodeListIterator(getNodeList(xml, NodeListXPath));
}
/**
* Creates an iterator for all direct child nodes within a given NodeList
* that are element nodes:
* node.getNodeType() == Node.ELEMENT_NODE
* node instanceof Element
* @param nodeList NodeList
* @return iterator over nodes
*/
public static Iterator<Node> getNodeListIterator(final NodeList nodeList) {
return new Iterator<Node>() {
private Iterator<Node> nodeIterator;
private Node lastNode;
{
ArrayList<Node> nodes = new ArrayList<Node>();
if (nodeList != null) {
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
//if (node.getNodeType() != Node.TEXT_NODE) {
if (node.getNodeType() == Node.ELEMENT_NODE && node instanceof Element) {
nodes.add(node);
}
}
}
nodeIterator = nodes.iterator();
}
@Override
public boolean hasNext() {
return nodeIterator.hasNext();
}
@Override
public Node next() {
lastNode = nodeIterator.next();
return lastNode;
}
@Override
public void remove() {
nodeIterator.remove();
// lastNode.drop();
}
};
}
public static Document convertStreamToXML(InputStream is) {
Document result = null;
if (is != null) {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = domFactory.newDocumentBuilder();
result = builder.parse(is);
} catch (ParserConfigurationException e) {
log.error("Error", e);
} catch (SAXException e) {
log.error("Error", e);
} catch (IOException e) {
log.error("Error", e);
}
}
return result;
}
}