Que fait elementFormDefault
-il et quand doit-il être utilisé?
J'ai donc trouvé quelques définitions des elementFormDefault
valeurs:
qualifié - les éléments et les attributs se trouvent dans le targetNamespace du schéma
non qualifié - les éléments et les attributs n'ont pas d'espace de noms
Donc, à partir de cette définition, je pense que si un schéma est défini sur qualifié, pourquoi devez-vous préfixer le type avec l'espace de noms? Et quels sont les scénarios dans lesquels vous auriez même défini un scénario non qualifié d'ailleurs? J'ai essayé Google, mais je n'ai eu que quelques pages W3C extrêmement difficiles à comprendre.
C'est le fichier avec lequel je travaille actuellement, pourquoi dois-je déclarer le type comme target:TypeAssignments
lorsque je déclare le targetNamespace
comme étant le même que 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>
Considérez le ComplexType suivant
AuthorType
utilisé par l'author
élément<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"/>
Si
elementFormDefault="unqualified"
alors l'instance XML suivante est valide
<x:author xmlns:x="http://example.org/publishing"> <name>Aaron Skonnard</name> <phone>(801)390-4552</phone> </x:author>
l'attribut de nom de l'auteur est autorisé sans spécifier l'espace de noms (non qualifié). Tous les éléments qui font partie de
<xsd:complexType>
sont considérés comme locaux à complexType.si
elementFormDefault="qualified"
alors l'instance doit avoir les éléments locaux qualifiés
<x:author xmlns:x="http://example.org/publishing"> <x:name>Aaron Skonnard</name> <x:phone>(801)390-4552</phone> </x:author>
veuillez consulter ce lien pour plus de détails
la source
Nouvelle réponse détaillée et explication à une ancienne question fréquemment posée ...
Réponse courte : Si vous n'ajoutez pas
elementFormDefault="qualified"
àxsd:schema
, launqualified
valeur par défaut signifie que les éléments déclarés localement ne sont pas dans l' espace de noms .Il y a beaucoup de confusion sur ce que
elementFormDefault
fait, mais cela peut être rapidement clarifié avec un court exemple ...Version simplifiée de votre 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>
Points clés:
assignment
élément est défini localement.elementFormDefault
estunqualified
.elementFormDefault="qualified"
ce qui seassignment
trouve dans l'espace de noms cible comme on s'y attendrait.form
attribut rarement utilisé sur lesxs:element
déclarations pour lesquelleselementFormDefault
établit des valeurs par défaut.XML apparemment valide
Ce XML semble être valide selon le XSD ci-dessus:
<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>
Remarquer:
assignments
lieuxassignments
et tous ses descendants dans l'espace de noms par défaut (http://www.levijackson.net/web340/ns
).Erreur de validation déroutante
Bien qu'il semble valide, le code XML ci-dessus génère l'erreur de validation déroutante suivante:
Remarques:
assignment
élément mais il a en fait trouvé unassignment
élément. ( WTF ){
et}
autourassignment
signifie que la validation n'attendaitassignment
aucun espace de noms ici. Malheureusement, quand il dit qu'il a trouvé unassignment
élément, il ne mentionne pas qu'il l'a trouvé dans un espace de noms par défaut qui ne diffère d'aucun espace de noms.Solution
elementFormDefault="qualified"
à l'xsd:schema
élément du XSD. Cela signifie qu'un XML valide doit placer des éléments dans l'espace de noms cible lorsqu'il est déclaré localement dans le XSD; sinon, un XML valide doit placer les éléments déclarés localement dans aucun espace de noms.assignment
soit dans aucun espace de noms. Ceci peut être réalisé, par exemple, en ajoutantxmlns=""
à l'assignment
élément.Crédits: Merci à Michael Kay pour ses commentaires utiles sur cette réponse.
la source
Il est important de noter avec elementFormDefault qu'il s'applique aux éléments définis localement , généralement des éléments nommés à l'intérieur d'un bloc complexType, par opposition aux éléments globaux définis au niveau supérieur du schéma. Avec elementFormDefault = "qualifié", vous pouvez adresser des éléments locaux dans le schéma à partir du document xml en utilisant l'espace de noms cible du schéma comme espace de noms par défaut du document.
En pratique, utilisez elementFormDefault = "qualifié" pour pouvoir déclarer des éléments dans des blocs imbriqués, sinon vous devrez déclarer tous les éléments au niveau supérieur et y faire référence dans le schéma des éléments imbriqués en utilisant l'attribut ref, ce qui entraînera un schéma beaucoup moins compact.
Ce bit du XML Schema Primer en parle: http://www.w3.org/TR/xmlschema-0/#NS
la source
elementFormDefault = "qualifié" est utilisé pour contrôler l'utilisation des espaces de noms dans les documents d'instance XML (fichier .xml), plutôt que les espaces de noms dans le document de schéma lui-même (fichier .xsd).
En spécifiant elementFormDefault = "qualifié", nous imposons la déclaration d'espace de noms à utiliser dans les documents validés avec ce schéma.
Il est courant de spécifier cette valeur pour déclarer que les éléments doivent être qualifiés plutôt que non qualifiés. Cependant, comme attributeFormDefault = "unqualified" est la valeur par défaut, il n'est pas nécessaire de la spécifier dans le document de schéma, si l'on ne veut pas qualifier les espaces de noms.
la source
J'ai remarqué que XMLSpy (au moins la version 2011) a besoin d'un targetNameSpace défini si elementFormDefault = "qualifié" est utilisé. Sinon, ne validera pas. Et ne générera pas non plus de fichiers XML avec des préfixes d'espace de noms
la source