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 matcher
hasSize()


您需要使用为Xpath表达式求值声明命名空间前缀的命名空间上下文:

receive(action -> action.endpoint(fooChannel)
        .namespace("ns", "http://domain/fault/2.0/")
        .validate("number:count(//ns:ValidationFault)", 1));
默认情况下,Xpath表达式的计算结果为节点值。因此,请确保使用
count()
函数来计算元素的数量

作为替代方案,您可以对节点集求值并使用Hamcrest matcher
hasSize()


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)));