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