Hello

I'am trying to make XPathNSResolver work...
I made 2 versions for resolving prefixes, one works :

XPathNSResolver nsResolver =
   evaluator.createNSResolver(buildNSDoc().getDocumentElement());

buildNSDoc() is a simple method which builds a new DOM document with
only a root element and namespaces declaration. When I create my
resolver by giving the document, it works fine.

The other method doesn't :

I made a class that implements XPathNSResolver and gives the
good namespace for a given prefix. Then I set these resolver
to the XPath evaluator

  // !!!!! XPathNSResolver subclassing : doesn't work
  //XPathNSResolver nsResolver = new NamespacesRes();


but an exception is raised :


test:
[java] java.lang.ClassCastException
[java] at org.apache.xpath.domapi.XPathEvaluatorImpl.createExpression(XPathEvaluatorImpl.java:165)
[java] at org.apache.xpath.domapi.XPathEvaluatorImpl.evaluate(XPathEvaluatorImpl.java:257)
[java] at test.XPathNSResolverTest.evalXpath(Unknown Source)
[java] at test.XPathNSResolverTest.main(Unknown Source)
[java] Exception in thread "main"
[java] Java Result: 1



any idea ?


I've got these XML buffer

<?xml version="1.0"?>
<ab:foo xmlns="http://ns.test.org/";
        xmlns:ab="http://ns.test.org/ab/";
        xmlns:xy="http://ns.test.org/xy/";>
  <list><xy:item>item1</xy:item><xy:item>item2</xy:item></list>
</ab:foo>

------------------------ 8< ------------------------------------------
package test;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.xpath.domapi.XPathEvaluatorImpl;
import org.w3c.dom.*;
import org.w3c.dom.xpath.*;
import org.xml.sax.InputSource;

class NamespacesRes implements XPathNSResolver {
  public String lookupNamespaceURI(String prefix) {
    System.out.println("lookupNamespaceURI " + prefix);
    if (prefix.equals("ab")) {
       return "http://ns.test.org/ab/";;
    } else if (prefix.equals("xy")) {
       return "http://ns.test.org/xy/";;
    } else if (prefix.equals("def")) {
       return "http://ns.test.org/";;
    } else {
       return null;
    }
  }
}

public class XPathNSResolverTest {
  private Document doc = null;
  public XPathNSResolverTest() {
  InputSource is;
  try {
    is = new InputSource(new StringReader(
           "<?xml version=\"1.0\"?>"
           + "<ab:foo xmlns=\"http://ns.test.org/\"; "
           + "     xmlns:ab=\"http://ns.test.org/ab/\"; "
           + "     xmlns:xy=\"http://ns.test.org/xy/\";>"
           + "<list><xy:item>item1</xy:item>"
           + "<xy:item>item2</xy:item></list>"
           + "</ab:foo>"));

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    dbf.setValidating(false);
    this.doc = dbf.newDocumentBuilder().parse(is);
  } catch (Exception e) {
    System.err.println(e.getMessage());
    e.printStackTrace();
  }
}


public Document buildNSDoc(){ Document nsdoc=null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DOMImplementation impl = dbf.newDocumentBuilder().getDOMImplementation(); nsdoc = impl.createDocument("http://ns.test.org/";, "def:nsdoc", null); Element root = nsdoc.getDocumentElement(); root.setAttributeNS("http://www.w3.org/2000/xmlns/";, "xmlns:ab", "http://ns.test.org/ab/";); root.setAttributeNS("http://www.w3.org/2000/xmlns/";, "xmlns:xy", "http://ns.test.org/xy/";); root.setAttributeNS("http://www.w3.org/2000/xmlns/";, "xmlns:def", "http://ns.test.org/";); } catch (ParserConfigurationException e) { e.printStackTrace(); } return nsdoc; }

public void evalXpath(String xpath) {
  XPathEvaluator evaluator = new XPathEvaluatorImpl(doc);

  // !!!!! XPathNSResolver subclassing : doesn't work
  //XPathNSResolver nsResolver = new NamespacesRes();

  // works !
  XPathNSResolver nsResolver =
   evaluator.createNSResolver(buildNSDoc().getDocumentElement());
                
   XPathResult result = (XPathResult) evaluator.evaluate(xpath, doc,
      nsResolver, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);

   System.out.println("Result >>");
   Node next = result.iterateNext();
   while (next != null) {
     XPathResult stringValue = (XPathResult) evaluator
         .evaluate("string()", next, nsResolver,
                   XPathResult.STRING_TYPE, null);

     System.out.println(stringValue.getStringValue());
     next = result.iterateNext();
   }
}

public static void main(String[] args) {
   XPathNSResolverTest test = new XPathNSResolverTest();
   test.evalXpath("/ab:foo/def:list/xy:item");
}

}
------------------------ 8< ------------------------------------------


regards

--
XPath free testing software :  http://lantern.sourceforge.net
Fr�d�ric Laurent                     http://www.opikanoba.org



Reply via email to