You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2004/05/04 23:13:52 UTC

DO NOT REPLY [Bug 20439] - About a class cast in XPathEvaluatorImpl.java

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=20439>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=20439

About a class cast in XPathEvaluatorImpl.java





------- Additional Comments From fl@opikanoba.org  2004-05-04 21:13 -------
Complete mail : http://marc.theaimsgroup.com/?l=xalan-dev&m=108368990131370&w=2

in short :

I made 2 versions for resolving prefixes, 
 - one works :
     XPathNSResolver nsResolver =
      evaluator.createNSResolver(buildNSDoc().getDocumentElement());
 - the other method doesn't :
     // !!!!! XPathNSResolver subclassing : doesn't work
     //XPathNSResolver nsResolver = new NamespacesRes();

     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

Test program

------------------------ 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< ------------------------------------------

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org