代码之家  ›  专栏  ›  技术社区  ›  Michael Wiles

xml与名称空间异常

  •  1
  • Michael Wiles  · 技术社区  · 16 年前

    以下几段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 回复  |  直到 16 年前
        1
  •  2
  •   Boldewyn    16 年前

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

    <fxd:GSR> 与…对比 <GSR> . 你看,第一个是前缀。现在,如果您定义一个名称空间 xmlns:fxd="" 不在此命名空间中 .

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

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

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

    http://aaa.yy.zz/Foo “因为 全部的

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

    “因为 具有 不 名称中的冒号(=没有前缀)。

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

    在第一个未固定元素出现之前的某个地方。如果您想反过来使用,则必须在所有不想在名称空间中的元素前面加上前缀,比如“bar:”,并将其添加到某个地方:

    xmlns:bar=""
    

    因此,在空名称空间中显式地设置它们(如前两个示例中所示)。

        2
  •  0
  •   Adrien Plisson    16 年前

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