Что делает elementFormDefault в XSD?
-
13-09-2019 - |
Вопрос
Что значит 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-файлы с префиксами пространства имен.