【问题标题】:Add an XML fragment to existing XML payload in BPEL process将 XML 片段添加到 BPEL 流程中的现有 XML 有效负载
【发布时间】:2013-11-24 14:06:52
【问题描述】:

我当前来自 BPEL 的有效负载 XML 看起来像,

<Parent>
<child1>
<key>K1</key>
<value>V1<value>
</child1>
<child1>
<key>K11</key>
<value>V11<value>
</child1>
<child2>
<key>K2</key>
<value>V2<value>
</child2>
</Parent>

我想将 child1 的新片段添加到现有 XML 负载中,以便输出如下所示,

<Parent>
<child1>
<key>K1</key>
<value>V1<value>
</child1>
<child1>
<key>K11</key>
<value>V11<value>
</child1>
<child1>
<key>K12</key>
<value>V12<value>
</child1>
<child2>
<key>K2</key>
<value>V2<value>
</child2>
</Parent>

我搜索了一下,发现 bpelx:append 方法可以帮助插入 xml 片段。 但我仍然不知道如何首先以 String/xml 数据类型创建/存储新片段,以便将其传递给现有的有效负载。

任何指点或帮助将不胜感激。

【问题讨论】:

    标签: xml soa bpel


    【解决方案1】:

    首先:您发布的 XML sn-ps 格式不正确,因为您在应有结束标签的不同位置使用了开始标签。

    其次,bpelx:append 函数不是 BPEL 的一部分,而是 Oracle 的专有扩展(我猜你正在使用它)。您可以找到有关此功能的文档以及其他可能对您有用的文档here。第三,您在assign 活动中的XPath 表达式中执行此转换。

    现在,你的实际问题:

    我仍然不知道如何首先在 String/xml 数据类型,以便可以将其传递给现有的有效负载。

    这在很大程度上取决于您想从哪里获取数据。在这个过程中是硬编码的吗?还是来自您收到的消息?

    免责声明:由于我没有安装 Oracle SOA Suite 实例,因此我没有测试这些代码片段。

    如果它是硬编码的,你可以把它放在一个文字块中:

    <bpel:assign>
        <bpelx:append>
              <from>
                   <literal>
                          <child1>....</child1>
                   </literal>  
              </from>
              <to variable="variableWithYourPayload"
                    query="/your-ns:Parent" />
        </bpelx:append> 
    </bpel:assign>
    

    如果它来自您收到的消息,那么您应该将消息存储在一个可以读取的变量中:

    <bpel:assign>
        <bpelx:append>
              <from variable="inputMessageWithChild1Content" />
              <to variable="consolidatedBillOfMaterialVar"
                    query="/your-ns:Parent" />
        </bpelx:append> 
    </bpel:assign>
    

    您也可以始终只创建 XML 类型的变量。但是,这需要在您导入的 WSDL 或 XSD 文件中的某处定义 XML 类型,通常情况下应该如此。这应该看起来像这样:

    <variable name = "myVar" type="myNs:child1" />
    <!-- more process code -->
    <bpel:assign>
              <from>
                   <literal>
                          <child1>....</child1>
                   </literal>  
              </from>
              <to variable="myVar" />
    </bpel:assign>
    

    之后,您可以在 append 中使用此变量,就像在第二个 sn-p 中一样。

    【讨论】:

    • 我尝试使用文字,但它给出了编译错误,因为它似乎无法识别文字。所以我使用
    • 另一种表达方式 :) 我只是更喜欢文字变体,因为你不必在那里逃避。顺便说一句,该变体在 Oracle BPEL 中确实有效(以前使用过)。您的编译错误可能与其他东西有关(我打赌通常的嫌疑人:命名空间)。
    【解决方案2】:

    我收到&lt;literal&gt; 的编译错误,并意识到我必须使用命名空间。一旦我将它切换到&lt;bpel:literal&gt;,我就能够毫无问题地编译和部署。只需确保您使用的是正确的名称空间。

    <variable name = "myVar" type="myNs:child1" /> <!-- more process code
    --> <bpelx:assign>
              <from>
                   <bpel:literal>
                          <child1>....</child1>
                   </bpel:literal>  
              </bpelx:from>
              <to variable="myVar" />
        </bpel:assign>
    

    【讨论】:

      猜你喜欢
      • 2022-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多