我尝试在Citrus Framework中替换输入XML的一些元素。
My Spring上下文包含:
yarn install
我的输入文件以:
开头 <citrus:namespace-context>
<citrus:namespace prefix="def" uri="http://sample.com/xmlns/2005"/>
</citrus:namespace-context>
我的端点以这种方式配置:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<ns0:canonicalMessageHeader xmlns:ns0="http://sample.com/xmlns/2005">
<ns0:headerVersion>1.0</ns0:headerVersion>
<ns0:bodyVersion>1.0</ns0:bodyVersion>
<ns0:trackingInfo>
<ns0:eventHandlerInitInfo>
<ns0:processInfo>
<ns0:adapterTrackingId>214F27DF-E1FB-4E84-9122-390C5876ABD2:1</ns0:adapterTrackingId>
...
我有以下错误:
<send endpoint="jms:topic:Order.Request?timeout=10000&connectionFactory=DEVconnectionFactoryFrom">
<message>
<resource file="com/sample/citrus/messages/input/SalesOrderTo.xml"/>
<element value="${track}" path="SOAP-ENV:Envelope/SOAP-ENV:Header/def:canonicalMessageHeader/def:trackingInfo/def:eventHandlerInitInfo/def:processInfo/def:adapterTrackingId"/>
导致此错误的可能原因是什么?
最好的问候
答案 0 :(得分:1)
您在XML中将 nso 定义为名称空间前缀,但在XPath上使用 def ,应 nso 。
答案 1 :(得分:1)
在通过XPath覆盖发送操作中的消息元素时,Citrus中缺少全局命名空间声明支持。已跟踪此问题:https://github.com/christophd/citrus/issues/331
与此同时,您必须使用与消息模板文件中完全相同的名称空间前缀 - 在您的情况下ns0:
此外,您可以丢弃XPath覆盖并使用点标记的节点覆盖,如下所示:
<send endpoint="jms:topic:Order.Request?timeout=10000&connectionFactory=DEVconnectionFactoryFrom">
<message>
<resource file="com/sample/citrus/messages/input/SalesOrderTo.xml"/>
<element value="${track}" path="Envelope.Header.canonicalMessageHeader.trackingInfo.eventHandlerInitInfo.processInfo.adapterTrackingId"/>
</message>
</send>
点表示法不是基于名称空间,而是使用本地元素名称来查找消息模板中的元素。显然没有XPath那么强大,但它适用于框架的当前版本。