向BPEL流程中的现有XML负载添加XML片段

向BPEL流程中的现有XML负载添加XML片段,xml,soa,bpel,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&

我当前从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>

K1
V1
K11
V11
K2
V2
我想在现有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>

K1
V1
K11
V11
K12
V12
K2
V2
我在谷歌上搜索发现bpelx:append方法可以帮助插入xml片段。 但我仍然不知道如何首先在String/xml数据类型中创建/存储新片段,以便将其传递给现有的有效负载


任何提示或帮助都将不胜感激。

首先:您发布的XML片段格式不好,因为您在应该放置结束标记的不同位置使用了开始标记

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

现在,谈谈你的实际问题:

我仍然不知道如何首先创建/存储一个新片段 String/xml数据类型,以便可以将其传递给现有负载

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

免责声明:因为我没有安装Oracle SOA套件的实例,所以我没有测试这些代码片段

如果它是硬编码的,您可以将其放在文字块中:

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

....

之后,您可以在
追加中使用此变量,就像在第二个代码片段中一样。

我得到了
的编译错误,并意识到我必须使用名称空间。一旦我将它切换到
,我就能够毫无问题地编译和部署。只需确保您使用的名称空间正确即可

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

....

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