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