Вопрос

Что значит elementFormDefault делать и когда его следует использовать?

Итак, я нашел несколько определений для elementFormDefault ценности:

квалифицированный - Элементы и атрибуты находятся в целевом положении схемы

неквалифицированный - Элементы и атрибуты не имеют пространства имен

Итак, исходя из этого определения, я бы подумал, что если схема настроена как квалифицированная, то почему вы должны префикс типа с пространством имен?И какие сценарии вы вообще можете назвать неквалифицированными?Я попробовал погуглить, но получил лишь пару страниц W3C, которые было крайне сложно понять.

Это файл, с которым я сейчас работаю, почему мне нужно объявлять тип как target:TypeAssignments когда я объявляю targetNamespace такой же, как xmlns:target?

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>
Это было полезно?

Решение

ElementFormDefault не имеет ничего общего с пространством имен типов в схеме, речь идет о пространствах имен элементов в XML-документах, которые соответствуют схеме.

Вот соответствующий раздел спецификации:

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.

Это означает, что пространство targetNamespace, которое вы объявили в верхней части схемы, применяется только к элементам в XML-документе, совместимом со схемой, только если elementFormDefault является «квалифицированным» или элемент явно объявлен в схеме как имеющий form="qualified" .

Например:Если elementFormDefault не указан -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

поместит ожидаемые элементы «name» в пространство targetName, а элементы «page» в нулевое пространство имен.

Чтобы избавить вас от необходимости указывать form="qualified" в каждом объявлении элемента, указание elementFormDefault="qualified" означает, что targetNamespace применяется к каждому элементу, если только оно не переопределено путем помещения form="unqualified" в объявление элемента.

Другие советы

Рассмотрим следующий ComplexType AuthorType использован author элемент

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>

Если elementFormDefault="unqualified"

тогда следующий экземпляр XML действителен

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>

атрибут имени автора допускается без указания пространства имен (неполный).Любые элементы, входящие в состав <xsd:complexType> считаются локальными для complexType.

если elementFormDefault="qualified"

тогда экземпляр должен иметь квалифицированные локальные элементы

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

пожалуйста, обратитесь этот ссылка для более подробной информации

Новый, подробный ответ и объяснение на старый, часто задаваемый вопрос...

Короткий ответ:Если вы не добавите elementFormDefault="qualified" к xsd:schema, то значение по умолчанию unqualified значение означает, что локально объявленные элементы находятся в нет пространства имен.

Существует большая путаница относительно того, что elementFormDefault да, но это можно быстро пояснить на коротком примере...

Оптимизированная версия вашего XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>

Ключевые моменты:

  • В assignment элемент определен локально.
  • Элементы, локально определенные в XSD, по умолчанию не находятся в пространстве имен.
    • Это связано с тем, что значение по умолчанию для elementFormDefault является unqualified.
    • Возможно, это дизайнерская ошибка создателей XSD.
    • Стандартная практика – всегда использовать elementFormDefault="qualified"так что assignment находится в пространстве имен цели, как было бы Подождите.

На первый взгляд действительный XML

Этот XML выглядит так, как будто он должен быть действительным в соответствии с приведенным выше XSD:

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>

Уведомление:

  • Пространство имен по умолчанию на assignments места assignments и все его потомки в пространстве имен по умолчанию (http://www.levijackson.net/web340/ns).

Непонятная ошибка проверки

Несмотря на то, что приведенный выше XML выглядит корректным, он выдает следующую запутанную ошибку проверки:

[Ошибка] try.xml:4:23:cvc-комплекс-тип.2.4.a:Недопустимое содержимое было найдено начиная с элемента 'assignment'.Одно из '{assignment}' ожидаемый.

Примечания:

  • Вы не будете первым разработчиком, который проклянет эту диагностику, которая, кажется, говорит, что контент недействителен, поскольку ожидалось найти assignment элемент, но на самом деле он нашел assignment элемент. (Что за черт?)
  • Что это на самом деле означает:В { и } вокруг assignment означает, что проверка ожидалась assignment ни в каком пространстве имен здесь.К сожалению, когда он говорит, что нашел assignment элемента, он не упоминает, что нашел его в пространстве имен по умолчанию, которое отличается от отсутствия пространства имен.

Решение

  • Подавляющее большинство времени: Добавлять elementFormDefault="qualified" к xsd:schema элемент XSD.Это означает, что действительный XML должен размещать элементы в целевом пространстве имен при локальном объявлении в XSD;в противном случае действительный XML должен размещать локально объявленные элементы вне пространства имен.
  • Крошечное меньшинство того времени: Измените XML в соответствии с XSD требование, что assignment не находиться ни в каком пространстве имен.Этого можно достичь, например, путем добавления xmlns="" к assignment элемент.

Важно отметить, что elementFormDefault применяется к локально определенные элементы, обычно называемые элементами внутри блока complexType, в отличие от глобальных элементов, определенных на верхнем уровне схемы.С помощью elementFormDefault="qualified" вы можете обращаться к локальным элементам схемы из XML-документа, используя целевое пространство имен схемы в качестве пространства имен документа по умолчанию.

На практике используйте elementFormDefault="qualified", чтобы иметь возможность объявлять элементы во вложенных блоках, в противном случае вам придется объявить все элементы на верхнем уровне и ссылаться на них в схеме во вложенных элементах, используя атрибут ref, что приведет к гораздо менее компактная схема.

Этот фрагмент в учебнике XML-схемы говорит об этом: http://www.w3.org/TR/xmlschema-0/#NS

elementFormDefault="qualified" используется для управления использованием пространств имен в документах экземпляра XML (файл .xml), а не пространств имен в самом документе схемы (файл .xsd).

Указывая elementFormDefault="qualified" мы принудительно используем объявление пространства имен в документах, проверенных с помощью этой схемы.

Обычно это значение указывается, чтобы объявить, что элементы должны быть квалифицированными, а не неквалифицированными.Однако, поскольку атрибутFormDefault="unqualified" является значением по умолчанию, его не нужно указывать в документе схемы, если не требуется уточнять пространства имен.

Я заметил, что XMLSpy (по крайней мере, версия 2011 года) требует определения targetNameSpace, если используется elementFormDefault="qualified".В противном случае не будет подтверждено.А также не будет генерировать XML-файлы с префиксами пространства имен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top