在BPEL流程中将XML片段添加到现有XML有效内容中

问题描述 投票:1回答:2

我目前来自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>

我用Google搜索并发现bpelx:append方法可以帮助插入xml片段。但我仍然无法弄清楚如何首先在String / xml数据类型中创建/存储新片段,以便可以将其传递给现有的有效负载。

任何指针或帮助将非常感激。

xml soa bpel
2个回答
0
投票

首先:您发布的XML片段格式不正确,因为您在结束标记所在的各个位置使用开始标记。

其次,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中使用此变量,就像在第二个片段中一样。


0
投票

我收到了<literal>的编译错误,并意识到我必须使用命名空间。一旦我将其切换到<bpel:literal>,我就能够编译和部署而没有任何问题。只需确保使用正确的名称空间即可。

<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>
© www.soinside.com 2019 - 2024. All rights reserved.