XML и аномалия пространства имен - PullRequest
1 голос
/ 18 ноября 2009

В чем разница между следующими частями 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 ]

2 голосов
/ 18 ноября 2009

Они не равны. То есть примеры 1 и 2 равны, а 3 - нет.

Посмотрите на <fxd:GSR> в отличие от <GSR>. Вы видите, что первый префикс. Теперь, если вы определяете пространство имен xmlns:fxd="", в этом пространстве имен устанавливаются все элементы с одинаковым префиксом. Все остальные (включая элементы без какого-либо префикса) не находятся в этом пространстве имен .

Затем в третьем примере вы определяете пространство имен для всех нефиксированных элементов. Это приводит к тому, что нефиксированные потомки GSR внезапно находятся в том же пространстве имен , что и их предок, а не в null пространстве имен они были до в 1 и 2.

Редактировать: Просто небольшое уточнение:

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

устанавливает пространство имен на "http://aaa.yy.zz/Foo" для всех элементов, которые начинаются с 'fxd:'.

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

устанавливает для пространства имен значение "http://aaa.yy.zz/Foo" для всех элементов, у которых в имени есть двоеточие без (= они не имеют префикса).

Если вы хотите, чтобы 1 и 2 вели себя как 3, просто добавьте

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

где-то до появления первого элемента без префикса. Если вы хотите наоборот, вам нужно добавить префикс всех элементов, которые вы хотите видеть в пространстве имен, скажем, «bar:», и добавить это куда-нибудь:

xmlns:bar=""

, таким образом, явно устанавливая их в пустом пространстве имен (как в первых двух примерах).

0 голосов
/ 18 ноября 2009

в вашем последнем примере не поместит ли все элементы, заключенные в элемент GSR, в пространство имен fxd? в первых двух примерах эти элементы, заключенные в элемент GSR, не находятся в пространстве имен fxd.

так что, я бы сказал, последний образец отличается от первого 2.

...