package org.gcube.common.resources.gcore.utils; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.namespace.NamespaceContext; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Simple XPath evaluator. * * @author Fabio Simeoni * */ public class XPathHelper { /** XPath engine. */; private static XPathFactory factory = XPathFactory.newInstance(); private XPath engine = factory.newXPath(); private Map namespaces = new HashMap(); private NamespaceContext nsContext = new NamespaceContext() { public String getNamespaceURI(String prefix) { return namespaces.get(prefix); } public Iterator getPrefixes(String val) { return null; } public String getPrefix(String uri) { return null; } }; /** Transformation engine. */ private static Transformer transformer; static { try { transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"yes"); } catch(Exception e) { throw new RuntimeException(e); } } private final Node root; /** * Creates an instance with a {@link Node} . * @param root the node */ public XPathHelper(Node root) { this.root=root; engine.setNamespaceContext(nsContext); } /** * Declares a namespace for XPath evaluation. * @param prefix the namespace prefix * @param uri the namespace URI */ public void addNamespace(String prefix,String uri) { namespaces.put(prefix,uri); } /** * Evaluates an XPath expression and returns matching values as strings. * @param xpath the expression * @return the list matching values */ public List evaluate(String xpath) { List results = new ArrayList(); try { NodeList set = evaluateForNodes(xpath); for (int i=0;i