xml和命名空间异常

时间:2009-11-18 08:17:23

标签: xml web-services xml-namespaces

以下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。它们被成功解析,但元素的名称空间不是它们应该的。

2 个答案:

答案 0 :(得分:2)

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

<fxd:GSR>形成鲜明对比,请<GSR>。你看,第一个是前缀。现在,如果定义名称空间xmlns:fxd="",则在此名称空间中设置所有同等前缀的元素。所有其他(包括根本没有任何前缀的元素)不在此命名空间

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

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

xmlns:fxd="http://aaa.yy.zz/Foo"
对于以'fxd:'开头的所有元素,

将名称空间设置为“http://aaa.yy.zz/Foo”。

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

所有元素的名称空间设置为“http://aaa.yy.zz/Foo”,其名称中包含 no 冒号(=它们不带前缀)。

如果您希望1和2的行为类似于3,只需添加

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

在第一个未加前缀的元素出现之前的某个地方。如果你想要反过来,那么你必须在所有没有命名空间的元素前面添加前缀,例如'bar:'并将其添加到某处:

xmlns:bar=""

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

答案 1 :(得分:0)

在上一个示例中,是否将所有元素都包含在fxd命名空间中的GSR元素中?在前2个样本中,GSR元素中包含的元素不在fxd名称空间中。

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