I'm getting a NullPointerException when calling XPath.evaluate() on a document that has an unexpanded entity reference node. If I pass in the same document with the entity reference expanded, everything works fine. I'm wondering if this expected behavior, a known issue, or if I should submit a bug report for this.

I'm using xalan 2.7.1 and xerces 2.9.0 with jdk 1.5.0_07.

Here's some code which re-produces the problem:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;

public class XPathTest {
 private static final String DOCUMENT_CONTENT =
   "<?xml version=\"1.0\"?>" +
   "<!DOCTYPE test [<!ENTITY foo SYSTEM \"foo\">]>" +
   "<test>&foo;</test>";

 private static final String XPATH = "//test";


 public static void main(String[] args) {
try {
     Document document = createDocument(DOCUMENT_CONTENT);
XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath();
     xpath.evaluate(XPATH, document, XPathConstants.NODESET);

     System.out.println("OK");
   } catch(Exception exception) {
     System.err.println("Caught exception: " + exception.getMessage());
     exception.printStackTrace(System.err);

     return;
   }
 }


 public static Document createDocument(String content) throws Exception  {
try { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities";, false); documentBuilderFactory.setFeature("http://apache.org/xml/features/dom/create-entity-ref-nodes";, true);

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); byte[] contentBytes = content.getBytes(); ByteArrayInputStream inputStream = new ByteArrayInputStream(contentBytes);
     Document document = documentBuilder.parse(inputStream);
return document;
   } catch(Exception exception) {
     System.err.println("Caught exception: " + exception.getMessage());
     exception.printStackTrace(System.err);
System.exit(1);
   }
return null;
 }
}


This is the result:

Caught exception: null
java.lang.NullPointerException
at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.nextNode(DOM2DTM.java:344) at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$IndexedDTMAxisTraverser.getNextIndexed(DTMDefaultBaseTraversers.java:572) at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$DescendantTraverser.next(DTMDefaultBaseTraversers.java:740) at com.sun.org.apache.xpath.internal.axes.DescendantIterator.nextNode(DescendantIterator.java:215) at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(NodeSequence.java:280) at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(NodeSequence.java:434) at com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList.<init>(DTMNodeList.java:79) at com.sun.org.apache.xpath.internal.objects.XNodeSet.nodelist(XNodeSet.java:338) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.getResultAsType(XPathImpl.java:323) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:276)
   at XPathTest.main(XPathTest.java:28)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:281)
   at XPathTest.main(XPathTest.java:28)
Caused by: java.lang.NullPointerException
at com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.DOM2DTM.nextNode(DOM2DTM.java:344) at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$IndexedDTMAxisTraverser.getNextIndexed(DTMDefaultBaseTraversers.java:572) at com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseTraversers$DescendantTraverser.next(DTMDefaultBaseTraversers.java:740) at com.sun.org.apache.xpath.internal.axes.DescendantIterator.nextNode(DescendantIterator.java:215) at com.sun.org.apache.xpath.internal.axes.NodeSequence.nextNode(NodeSequence.java:280) at com.sun.org.apache.xpath.internal.axes.NodeSequence.runTo(NodeSequence.java:434) at com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList.<init>(DTMNodeList.java:79) at com.sun.org.apache.xpath.internal.objects.XNodeSet.nodelist(XNodeSet.java:338) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.getResultAsType(XPathImpl.java:323) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:276)
   ... 1 more


--
Kevin Froese


Reply via email to