Неквалифицированный XML-элемент с префиксным пространством имен внутри - PullRequest
2 голосов
/ 09 апреля 2019

У меня есть следующий XML:

<ns1:verifySignedDocumentResponse xmlns:ns1="http://signing.ws.comarch.gov">
    <verifySignedDocumentReturn xmlns:ns2="http://exception.ws.comarch.gov">Some string content...</verifySignedDocumentReturn>
</ns1:verifySignedDocumentResponse>

В случае verifySignedDocumentReturn мне интересно, правильно ли определять префикс (xmlns:ns2=...), но не дляквалифицировать (ns2:verifySignedDocumentReturn) соответствующий элемент с этим префиксом?

w3schools.com приводит примеры , которые показывают:

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

Но в моем примере нет пространства имен по умолчанию.Итак, я ожидаю, что verifySignedDocumentReturn будет иметь префикс ns2.

Я получил этот XML-фрагмент из реального сервиса, поэтому я задаюсь вопросом: это правильно и правильно?Или просто невнимательность создателей сервиса?Я спрашиваю, потому что я новичок в XML / XSD.

Я пытался сгенерировать XSD из этого XML с различными онлайн-генераторами, но ни одна сгенерированная схема не выглядит разумной.

Вариант 1(вообще не учитывает ns2 пространство имен):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" 
           targetNamespace="http://signing.ws.comarch.gov" 
           xmlns:ns1="http://signing.ws.comarch.gov">
   <xs:element name="verifySignedDocumentResponse">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="verifySignedDocumentReturn" form="unqualified" 
                    type="xs:string"/>
      </xs:sequence>
   </xs:complexType>
 </xs:element>

Вариант 2:

schema0.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:ns1="http://signing.ws.comarch.gov" 
           xmlns:ns2="http://exception.ws.comarch.gov" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           targetNamespace="http://signing.ws.comarch.gov" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="schema1.xsd" />
  <xs:element name="verifySignedDocumentResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="verifySignedDocumentReturn" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

schema1.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="verifySignedDocumentReturn" type="xs:string" />
</xs:schema>

1 Ответ

1 голос
/ 15 апреля 2019

Первое, на что стоит обратить внимание, - объявление xmlns:ns2="http://exception.ws.comarch.gov" в вашем XML-документе ничего не делает. Это просто определение псевдонима ns2, который никогда не используется.

Обе сгенерированные схемы выглядят нормально. Несколько заметок о них.

Хотя первая схема аккуратно вписывается в один XSD, обычно elementFormDefault устанавливается на qualified и не изменяется внутри схемы. В этой схеме form устанавливается для unqualified для внутреннего элемента. Я не уверен на 100%, но я думаю, что проверяющий синтаксический анализатор XML, использующий эту схему, будет обрабатывать verifySignedDocumentReturn, как будто он находится в пространстве имен "http://signing.ws.comarch.gov". Я думаю, что изменение form в середине XSD документ запрашивает проблемы несовместимости.

Второй набор схем выглядит хорошо.

...