用XPath替换元素

时间:2018-01-30 12:40:38

标签: xpath xml-namespaces citrus-framework

我尝试在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&amp;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"/>

导致此错误的可能原因是什么?

最好的问候

2 个答案:

答案 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&amp;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那么强大,但它适用于框架的当前版本。