Что делает elementFormDefault в XSD?
что значит elementFormDefault
do, и когда он должен использоваться?
поэтому я нашел некоторые определения для elementFormDefault
значения:
квалификации - элементы и атрибуты находятся в targetNamespace схема
неквалифицированные - элементы и атрибуты не имеют пространства имен
поэтому из этого определения я бы подумал, что если схема установлена в qualified, то почему вы должны префикс типа с пространством имен? И каковы сценарии, которые вы даже установили бы для неквалифицированного, если на то пошло? Я попробовал погуглить, но все, что я получил, это пару страниц 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>
6 ответов
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 "будут находиться в targetNamespace, а элементы" page " - в пространстве имен null.
чтобы сохранить вам нужно поставить 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"
to xsd:schema
, то по умолчанию unqualified
значение означает, что локально объявленные элементы находятся в пространство имен.
есть много путаницы относительно того, что elementFormDefault
, но это можно быстро уточнить с коротким примером...
модернизированная версия ваш отзыв:
<?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
isunqualified
. - это, возможно, ошибка дизайна создателями 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 дает следующую ошибку запутанной проверки:
[ошибка] попробовать.XML-кода:4:23: вах-сложного-типа.2.4.a: недопустимое содержимое начиная с назначения элемента''. Один из " {назначение}" ожидаемый.
Примечания:
- вы не будете первым разработчиком, чтобы проклясть эту диагностику, которая, кажется, говорит, что содержимое недопустимо, потому что оно ожидало найти
assignment
элемент, но это на самом деле нашелassignment
элемент. (WTF) - что это на самом деле означает:
{
и}
вокругassignment
означает, что проверка ожидалassignment
в пространстве имен здесь. К сожалению, когда он говорит, что он нашелassignment
элемент, он не упоминает, что он нашел его в пространстве имен по умолчанию, которое отличается от пространства имен.
решение
-
подавляющее в большинстве случаев: добавить
elementFormDefault="qualified"
доxsd:schema
элемент XSD. Это означает, что допустимый XML должен размещать элементы в целевом пространстве имен при локальном объявлении в XSD; в противном случае допустимый XML должен размещать локально объявленные элементы в пространстве имен. -
крошечное меньшинство времени: измените XML в соответствии с XSD
требование
assignment
в пространстве имен. Это может быть достигнуто, например, добавивxmlns=""
доassignment
элемент.
важно отметить, что elementFormDefault относится к локально определенные элементы, обычно именованные элементы внутри блока complexType, в отличие от глобальных элементов, определенных на верхнем уровне схемы. С помощью elementFormDefault= "qualified" вы можете обращаться к локальным элементам схемы из xml-документа, используя целевое пространство имен схемы в качестве пространства имен по умолчанию документа.
на практике используйте elementFormDefault= "квалифицированный", чтобы иметь возможность чтобы объявить элементы во вложенных блоках, в противном случае вам придется объявить все элементы на верхнем уровне и ссылаться на них в схеме во вложенных элементах с помощью атрибута ref, что приведет к гораздо менее компактной схеме.
этот бит в XML-схеме Primer говорит об этом:http://www.w3.org/TR/xmlschema-0/#NS
elementFormDefault= "qualified" используется для управления использованием пространств имен в документах экземпляра XML (.xml-файл), а не пространства имен в самом документе схемы (.XSD-файл.)
указав elementFormDefault= "qualified", мы применяем объявление пространства имен для использования в документах, проверенных с помощью этой схемы.
обычно указывается это значение, чтобы объявить, что элементы должны быть квалифицированы, а не неквалифицированы. Однако, поскольку attributeFormDefault= "unqualified" - это значение по умолчанию, его не нужно указывать в документе схемы, если не требуется квалифицировать пространства имен.
Я заметил, что XMLSpy (по крайней мере, версия 2011)нуждается в targetNameSpace, определенном, если используется elementFormDefault="qualified". В противном случае не будет проверять. А также не будет генерировать xmls с префиксами пространства имен