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

时间:2013-11-12 12:15:44

标签: xml soa bpel

来自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>

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

<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数据类型中创建/存储新片段,以便可以将其传递给现有的有效负载。

非常感谢任何指针或帮助。

2 个答案:

答案 0 :(得分:0)

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

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

现在,问你的实际问题:

  

我仍然无法弄清楚如何首先在a中创建/存储新片段   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中使用此变量,就像在第二个代码段中一样。

答案 1 :(得分: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>