diff artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XMLUtils.java @ 323:1d3607ceb9fa

Improved the XMLUtils to support xpath expressions that contain variables. artifacts/trunk@2540 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 24 Aug 2011 07:44:11 +0000
parents 715bdf990739
children e7d3f74854fb
line wrap: on
line diff
--- a/artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XMLUtils.java	Tue Aug 23 10:54:38 2011 +0000
+++ b/artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XMLUtils.java	Wed Aug 24 07:44:11 2011 +0000
@@ -8,6 +8,7 @@
 
 package de.intevation.artifacts.common.utils;
 
+import java.util.Map;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 
@@ -41,6 +42,7 @@
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathVariableResolver;
 
 import org.apache.log4j.Logger;
 
@@ -222,7 +224,7 @@
      * @return the new XPath.
      */
     public static final XPath newXPath() {
-        return newXPath(null);
+        return newXPath(null, null);
     }
 
     /**
@@ -231,12 +233,19 @@
      * if none should be used.
      * @return The new XPath
      */
-    public static final XPath newXPath(NamespaceContext namespaceContext) {
+    public static final XPath newXPath(
+        NamespaceContext      namespaceContext,
+        XPathVariableResolver resolver)
+    {
         XPathFactory factory = XPathFactory.newInstance();
         XPath        xpath   = factory.newXPath();
         if (namespaceContext != null) {
             xpath.setNamespaceContext(namespaceContext);
         }
+
+        if (resolver != null) {
+            xpath.setXPathVariableResolver(resolver);
+        }
         return xpath;
     }
 
@@ -294,12 +303,26 @@
         QName            returnType,
         NamespaceContext namespaceContext
     ) {
+        return xpath(root, query, returnType, namespaceContext, null);
+    }
+
+    public static final Object xpath(
+        Object           root,
+        String           query,
+        QName            returnType,
+        NamespaceContext namespaceContext,
+        Map<String, String> variables)
+    {
         if (root == null) {
             return null;
         }
 
+        XPathVariableResolver resolver = variables != null
+            ? new MapXPathVariableResolver(variables)
+            : null;
+
         try {
-            XPath xpath = newXPath(namespaceContext);
+            XPath xpath = newXPath(namespaceContext, resolver);
             if (xpath != null) {
                 return xpath.evaluate(query, root, returnType);
             }

http://dive4elements.wald.intevation.org