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
