我有以下XML文档:
<application xmlns="http://www.example.com/schemas/app-config/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/schemas/app-config/1.0 http://www.example.com/schemas/app-config/1.0/app-config-1.0.xsd">
<info name="Dummy Application" runningOn="Dev"/>
</application>
当我运行以下代码时:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/application/info@name");
我在XPathExpressionException
方法上获得compile
。该例外的消息只是“null
”。看起来我正确地使用XPath来定位name
属性,但是我想知道我的所有XMLNS和XSI声明是否都在这里引起问题?如果没有,那么我完全无能为力,不知道造成这种异常的原因。
有一件事 - 在compile
实例与我的实际xpath
对象相关联之前,Document
如何失败?!
答案 0 :(得分:2)
编译方法抛出异常,因为您的XPath表达式无效。您可能想要使用"/application/info/@name"
。
答案 1 :(得分:1)
表达式/application/info@name
中只是语法错误,正确的语法是/application/info/@name
。但请注意,您的XML示例具有默认命名空间,因此对于XPath 1.0,表达式/application/info/@name
不会选择该示例中的任何内容,使用XPath 2.0时,您需要确保关联定义XPath评估的默认命名空间。使用XPath 1.0,您需要为Java代码中的默认命名空间定义前缀(例如df
),然后使用例如/df:application/df:info/@name
。我不熟悉Java XPath API,所以其他人需要帮助解决如何使用XPathNamespaceContext或类似设置命名空间的具体代码。