Qu'est-ce elementFormDefault faire en XSD?
-
13-09-2019 - |
Question
Qu'est-ce elementFormDefault
faire, et quand doit-il être utilisé?
Alors j'ai trouvé quelques définitions pour les valeurs elementFormDefault
:
qualifiés - éléments et attributs sont dans le targetNamespace du schéma
non qualifiées - éléments et attributs ne disposent pas d'un espace de noms
Donc, de cette définition, je pense que si un schéma est défini sur qualifié alors pourquoi vous devez préfixer le type avec l'espace de noms? Et quels sont les scénarios que vous même avoir un ensemble à non qualifié pour cette question? J'ai essayé googler, mais tout ce que je suis arrivé étaient quelques pages du W3C couple qui ont été extrêmement difficiles à comprendre.
Ceci est le fichier, je travaille avec en ce moment, pourquoi dois-je déclarer le type comme target:TypeAssignments
quand je déclare la targetNamespace
comme 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>
La solution
elementFormDefault n'a rien à voir avec l'espace de noms des types dans le schéma, il est sur les espaces de noms des éléments dans les documents XML conformes au schéma.
Voici la section relevent de la spécification:
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·.
Qu'est-ce que cela signifie est que le targetNamespace vous avez déclaré au sommet du schéma applique uniquement aux éléments dans le schéma document XML conforme si l'elementFormDefault est « qualifié » ou l'élément est explicitement déclaré dans le schéma comme ayant une forme = "qualifié".
Par exemple: Si elementFormDefault est non qualifiée -
<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
placera s'attendre à des éléments « nom » pour être dans le targetNamespace et éléments « page » d'être dans l'espace vide.
Pour vous éviter d'avoir à mettre sous forme = « qualifié » sur chaque déclaration d'élément indiquant elementFormDefault = « qualifié » signifie que le targetNamespace applique à chaque élément, sauf contrordre en mettant sous forme = « sans réserve » sur la déclaration de l'élément.
Autres conseils
Considérons le AuthorType
ComplexType suivant utilisé par l'élément de 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"/>
Si elementFormDefault="unqualified"
puis en suivant instance XML est valide
<x:author xmlns:x="http://example.org/publishing">
<name>Aaron Skonnard</name>
<phone>(801)390-4552</phone>
</x:author>
attribut du nom des auteurs 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 devrait 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>
ce lien pour plus de détails
Nouveau réponse détaillée et une explication à un vieux, une foire aux questions ...
Réponse courte :. Si vous n'ajoutez pas elementFormDefault="qualified"
à xsd:schema
, la valeur de unqualified
par défaut signifie que les éléments déclarés localement sont pas d'espace de nom
Il y a beaucoup de confusion au sujet de ce elementFormDefault
fait, mais cela peut être clarifiée rapidement 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:
- L'élément
assignment
est définie localement. - Les éléments définis localement dans XSD sont en aucun espace de noms par défaut.
- En effet, la valeur par défaut pour
elementFormDefault
estunqualified
. - Ceci est sans doute une erreur de conception par les créateurs de XSD.
- La pratique courante est d'utiliser toujours
elementFormDefault="qualified"
de sorte queassignment
est dans l'espace de noms cible comme on le ferait attendre.
- En effet, la valeur par défaut pour
XML valide Apparemment
Ce XML ressemble devrait ê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>
Remarque:
- L'espace de noms par défaut sur les lieux de
assignments
assignments
et tous ses descendants dans l'espace de noms par défaut (http://www.levijackson.net/web340/ns
).
Perplexing Erreur de validation
En dépit de la recherche valide, le XML ci-dessus donne l'erreur de validation confusion suivante:
[Error] try.xml: 4: 23: cvc-complexe type.2.4.a: contenu non valide a été trouvé en commençant par l'élément « cession ». L'un des « {cession} » est attendu.
Notes:
- Vous ne seriez pas le premier développeur à maudire ce diagnostic qui semble dire que le contenu est invalide parce qu'elle devrait trouver un élément de
assignment
mais effectivement trouvé un élémentassignment
. ( WTF ) - Ce que cela signifie vraiment: Le
{
et}
autourassignment
signifie que la validation attendaitassignment
dans aucun espace de noms ici. Malheureusement, quand il dit qu'il a trouvé un élémentassignment
, il ne mentionne pas qu'il a trouvé dans un espace de noms par défaut qui diffère de aucun espace de noms.
Solution
- La grande majorité du temps: Ajouter
elementFormDefault="qualified"
à l'élémentxsd:schema
du XSD. Cela signifie XML valide doit placer des éléments dans l'espace de noms cible lorsque déclaré localement dans le XSD; sinon, XML valide doit placer déclaré localement des éléments dans aucun espace de noms. - minorité minuscule du temps: Modifier le code XML pour se conformer à la XSD de
exigence
assignment
être dans aucun espace de noms. Ceci peut être réalisé, par exemple, en ajoutantxmlns=""
à l'élément deassignment
.
Il est important de noter avec elementFormDefault est qu'il applique à sur place éléments définis, éléments généralement nommés dans un bloc de complexType, par opposition aux éléments globaux définis sur le haut niveau du schéma. Avec elementFormDefault = « qualifié », vous pouvez répondre à 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.
Dans la pratique, utiliser elementFormDefault = « qualifié » pour être en mesure de déclarer des éléments dans des blocs imbriqués, sinon vous devrez déclarer tous les éléments au niveau supérieur et référence dans le schéma des éléments imbriqués en utilisant l'attribut ref, résultant dans un schéma beaucoup moins compact.
Ce bit dans les discussions de schéma XML Primer à son sujet: http://www.w3.org/TR / xmlschema-0 / # NS
elementFormDefault = "qualifié" est utilisé pour contrôler l'utilisation des espaces de noms dans les documents d'instance XML (fichier .xml), plutôt que namespaces dans le document de schéma lui-même (fichier .xsd).
En spécifiant elementFormDefault = « qualifié » nous imposons déclaration d'espace de noms à utiliser dans les documents validés avec ce schéma.
Il est pratique courante de préciser cette valeur à déclarer que les éléments doivent être qualifiés plutôt que non qualifiée. Cependant, étant donné que attributeFormDefault = « absolu » est la valeur par défaut, il n'a pas besoin d'être spécifié dans le document de schéma, si l'on ne veut pas qualifier les espaces de noms.
Je l'ai remarqué que XMLSpy (au moins version 2011) a besoin d'un TargetNamespace défini si elementFormDefault = "qualifié" est utilisé. Sinon, ne validera pas. Et aussi ne génère pas xmls avec des préfixes d'espace de noms