1

以下几段xml有什么区别?

我问的原因是,当我将 xml 提交到 BPEL 流程时,第一个和第二个工作但最后一个没有,这是怎么回事?

<!-- imported namespace referenced with prefix -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:fxd="http://aaa.yy.zz/Foo">
     <soap:Body>
         <fxd:GSR>
             <aaa>
                 <a>1000000</a>
                 <c>UUU</c>
                 <cp>ZZ</cp>
             </aaa>
             <bbb>
                 <cc>CCC</cc>
                 <v>110005632501</v>
             </bbb>
             <adate>2009-11-04T07:14:44.5814828+02:00</adate>
             <bdate>2009-11-04T07:14:44.5814828+02:00</bdate>
             <m>NNNN</m>
             <p>SSSS</p>
             <r>LLLL</r>
         </fxd:GSR>
     </soap:Body>
    </soap:Envelope>        

<!-- inline imported namespace referenced with a prefix-->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <soap:Body>
         <fxd:GSR xmlns:fxd="http://aaa.yy.zz/Foo">
             <aaa>
                 <a>1000000</a>
                 <c>UUU</c>
                 <cp>ZZ</cp>
             </aaa>
             <bbb>
                 <cc>CCC</cc>
                 <v>110005632501</v>
             </bbb>
             <adate>2009-11-04T07:14:44.5814828+02:00</adate>
             <bdate>2009-11-04T07:14:44.5814828+02:00</bdate>
             <m>NNNN</m>
             <p>SSSS</p>
             <r>LLLL</r>
         </fxd:GSR>
     </soap:Body>
</soap:Envelope>


<!-- inline namespace -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body>
           <GSR xmlns="http://aaa.yy.zz/Foo">
               <aaa>
                   <a>1000000</a>
                   <c>UUU</c>
                   <cp>ZZ</cp>
               </aaa>
               <bbb>
                   <cc>CCC</cc>
                   <v>110005632501</v>
               </bbb>
               <adate>2009-11-04T07:14:44.5814828+02:00</adate>
               <bdate>2009-11-04T07:14:44.5814828+02:00</bdate>
               <m>NNNN</m>
               <p>SSSS</p>
               <r>LLLL</r>
           </GSR>
       </soap:Body>
</soap:Envelope>

我的直觉说它们是等价的 xml,特别是考虑到它们来自同一个 wsdl。它们已成功解析,但元素的名称空间不是它们应有的名称。

4

2 回答 2

2

他们相等。也就是说,示例 1 和示例 2 相等,但示例 3 不相等。

<fxd:GSR>对比来看<GSR>。你看,第一个是前缀。现在,如果你定义了一个命名空间xmlns:fxd="",那么所有具有相同前缀的元素都设置在这个命名空间中。所有其他(包括根本没有任何前缀的元素)都不在此命名空间中。

然后,在您的第三个示例中,您为所有无前缀元素定义了一个命名空间。这导致了这样一个事实,即 GSR 的无前缀子代突然与它们的祖先在同一个命名空间中,而不是在它们之前在 1 和 2中的null命名空间中。

编辑:只是一个小的澄清:

xmlns:fxd="http://aaa.yy.zz/Foo"

将所有以“fxd:”开头的元素的命名空间设置为“ http://aaa.yy.zz/Foo ” 。

xmlns="http://aaa.yy.zz/Foo"

对于名称中没有冒号的所有元素(= 它们没有前缀),将命名空间设置为“ http://aaa.yy.zz/Foo ” 。

如果您希望 1 和 2 表现得像 3,只需添加

xmlns="http://aaa.yy.zz/Foo"

在第一个无前缀元素出现之前的某个地方。如果你想要它反过来,你必须在你想在没有命名空间的所有元素前面加上'bar:',然后在某处添加:

xmlns:bar=""

因此将它们显式设置在 null 命名空间中(就像在前两个示例中一样)。

于 2009-11-18T08:30:42.257 回答
0

在您的上一个示例中,它不会将包含在 GSR 元素中的所有元素都放在 fxd 命名空间中吗?在前 2 个示例中,包含在 GSR 元素中的那些元素不在 fxd 命名空间中。

所以,我想说最后一个样本与前两个不同。

于 2009-11-18T08:28:18.113 回答