Java XPath验证找不到元素
我有一个包含元素Java XPath验证找不到元素,java,xml,xpath,citrus-framework,Java,Xml,Xpath,Citrus Framework,我有一个包含元素ValidationFault的XML负载。验证的一部分是确认ValidationFault元素在XML有效负载中只出现一次。使用以下Java DSL: runner.receive(action -> action.endpoint(endpointName) .validate("number://ValidationFault", 1)); 我没有返回预期值1,而是0: com.consol.citrus.exceptions.Tes
ValidationFault
的XML负载。验证的一部分是确认ValidationFault
元素在XML有效负载中只出现一次。使用以下Java DSL:
runner.receive(action -> action.endpoint(endpointName)
.validate("number://ValidationFault", 1));
我没有返回预期值1,而是0:
com.consol.citrus.exceptions.TestCaseFailedException: Validation failed: Values not equal for element '//ValidationFault', expected '1' but was '0'
我已经手动确认响应负载确实包含有问题的元素。我还使用外部工具验证了XPath,发现XPath应该是正确的。我也尝试过名称空间,//soapenv:ValidationFault
和//:ValidationFault
,但我收到了相同的异常
编辑:
这是接收到的XML负载(删除了一些数据):
soapenv:客户端
验证错误
行礼
flt-00001
架构验证失败
您需要使用为Xpath表达式求值声明命名空间前缀的命名空间上下文:
receive(action -> action.endpoint(fooChannel)
.namespace("ns", "http://domain/fault/2.0/")
.validate("number:count(//ns:ValidationFault)", 1));
默认情况下,Xpath表达式的计算结果为节点值。因此,请确保使用count()
函数来计算元素的数量
作为替代方案,您可以对节点集求值并使用Hamcrest matcherhasSize()
:
您需要使用为Xpath表达式求值声明命名空间前缀的命名空间上下文:
receive(action -> action.endpoint(fooChannel)
.namespace("ns", "http://domain/fault/2.0/")
.validate("number:count(//ns:ValidationFault)", 1));
默认情况下,Xpath表达式的计算结果为节点值。因此,请确保使用count()
函数来计算元素的数量
作为替代方案,您可以对节点集求值并使用Hamcrest matcherhasSize()
:
ValidationFault
(及其所有子体)位于默认命名空间http://domain/fault/2.0/
。也许这会有所帮助:(我不熟悉citrus框架。)我怀疑这可能是由名称空间引起的,但使用/:ValidationFault
处理默认名称空间并没有解决问题。ValidationFault
(及其所有子体)都位于默认名称空间http://domain/fault/2.0/
。也许这会有所帮助:(我不熟悉citrus框架。)我怀疑这可能是由名称空间引起的,但使用/:ValidationFault
处理默认名称空间并不能解决问题。
receive(action -> action.endpoint(fooChannel)
.namespace("ns", "http://domain/fault/2.0/")
.validate("node-set://ns:ValidationFault", Matchers.hasSize(1)));