我正在学习如何使用java XPath API,我对XPathExpression类的evaluate()方法的行为提出了疑问。
我的XML文件包含员工数据
我希望以String的形式找到收入最高的员工,所以我写下这段代码:
FileInputStream file = new FileInputStream(new File
("D:\\workspace\\NetCrackerTasks\\src\\ru\\ncedu\\java\\tasks\\emp.xml"));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document src = builder.parse(file);
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/content/emp/employee[not(../employee/sal > xs:decimal(sal))]";
String result = null;
XPathExpression expr = null;
try {
expr = xPath.compile(expression);
result = expr.evaluate(src); //This throws NullPointerException
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return result;
当我在Eclipse中运行此代码时,expr.evaluate(src)
会抛出NullPointerException。
在docs.oracle.com(link)的文档中,它说的是
如果source为null,则抛出NullPointerException。
我检查了我的src
对象,它不是null,xml文档的路径是正确的。
所以我的问题是:为什么我会得到NullPointerException?
并没有更合适的方法来获取符合XPath表达式的String形式的XML文档元素吗?
我的XML文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<content
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="ns:emp"
xsi:schemaLocation="ns:emp emp.xsd">
<emp>
<employee deptno="10" empno="7369" mgr="7902">
<ename>SMITH</ename>
<job>CLERK</job>
<hiredate>1980-12-17</hiredate>
<sal>800.00</sal>
<comm>0.0</comm>
</employee>
<employee deptno="30" empno="7521" mgr="7698">
<ename>WARD</ename>
<job>SALESMAN</job>
<hiredate>1981-02-22</hiredate>
<sal>1250.00</sal>
<comm>500.00</comm>
</employee>
<employee deptno="20" empno="7566" mgr="7839">
<ename>JONES</ename>
<job>MANAGER</job>
<hiredate>1981-04-02</hiredate>
<sal>2975.00</sal>
<comm>0.0</comm>
</emp>
</content>
编辑:当xPath.compile(expression);
运行时,expr
不返回null,expr.evaluate(src)
不为空。因此抛出NullPointerException不是因为在null对象上调用方法,因为object不为null。