113 votes

Que fait elementFormDefault en XSD ?

Qu'est-ce que elementFormDefault et quand doit-on l'utiliser ?

J'ai donc trouvé des définitions pour elementFormDefault valeurs :

qualifiés - éléments et attributs se trouvent dans l'espace de nommage cible du schéma

sans réserve - n'ont pas d'espace de noms

D'après cette définition, je pense que si un schéma est défini comme qualifié, pourquoi faut-il préfixer le type avec l'espace de noms ? Et quels sont les scénarios où l'on peut même avoir un schéma non qualifié ? J'ai essayé de chercher sur Google, mais tout ce que j'ai obtenu, ce sont quelques pages du W3C qui étaient extrêmement difficiles à comprendre.

C'est le fichier avec lequel je travaille en ce moment, pourquoi dois-je déclarer le type en tant que target:TypeAssignments lorsque je déclare le targetNamespace comme le même que celui de 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>

87voto

Alohci Points 30645

ElementFormDefault n'a rien à voir avec l'espace de noms des types dans le schéma, il s'agit de l'espace de noms des éléments dans les documents XML qui sont conformes au schéma.

Voici la section pertinente 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·.

Cela signifie que l'espace de noms cible que vous avez déclaré en haut du schéma ne s'applique aux éléments du document XML conforme au schéma que si elementFormDefault est "qualified" ou si l'élément est déclaré explicitement dans le schéma comme ayant une forme="qualified".

Par exemple : Si elementFormDefault n'est pas qualifié -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

s'attendra à ce que les éléments "name" soient dans l'espace de noms cible et que les éléments "page" soient dans l'espace de noms null.

Pour vous éviter d'avoir à mettre form="qualified" dans chaque déclaration d'élément, l'indication elementFormDefault="qualified" signifie que l'espace de nommage cible s'applique à chaque élément, à moins qu'il ne soit remplacé par form="unqualified" dans la déclaration de l'élément.

76voto

kjhughes Points 5581

<em>Nouvelle réponse détaillée et explication à une ancienne question fréquemment posée...</em>

Réponse courte : Si vous n'ajoutez pas elementFormDefault="qualified" a xsd:schema , puis la valeur par défaut unqualified signifie que les éléments déclarés localement sont dans pas d'espace de noms .

Il y a beaucoup de confusion sur ce qu'est un elementFormDefault mais cela peut être rapidement clarifié à l'aide d'un petit 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 :

  • En assignment est défini localement.
  • Les éléments définis localement dans le XSD n'appartiennent par défaut à aucun espace de noms.
    • En effet, la valeur par défaut de elementFormDefault es unqualified .
    • Il s'agit sans doute d'une erreur de conception de la part des créateurs de XSD.
    • La pratique courante consiste à toujours utiliser elementFormDefault="qualified" de sorte que assignment se trouve dans l'espace de noms cible, comme le ferait un s'attendre.
  • Il s'agit d'un outil rarement utilisé form sur l'attribut xs:element les déclarations pour lesquelles elementFormDefault é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>

Avis :

  • L'espace de noms par défaut sur assignments lieux assignments et tous ses descendants dans l'espace de noms par défaut ( http://www.levijackson.net/web340/ns ).

Erreur de validation qui laisse perplexe

Bien qu'il ait l'air valide, le XML ci-dessus produit l'erreur de validation suivante, qui prête à confusion :

[Erreur] try.xml:4:23 : cvc-complex-type.2.4.a : Un contenu invalide a été contenu invalide a été trouvé en commençant par l'élément 'assignment'. Un des éléments '{assignment}' est attendu.

Notes :

  • Vous ne seriez pas le premier développeur à maudire ce diagnostic qui semble dire que le contenu n'est pas valide parce qu'il s'attendait à trouver un assignment mais il a en fait trouvé un élément assignment élément. ( WTF )
  • Ce que cela signifie vraiment : Le { y } autour de assignment signifie que la validation attendait assignment dans aucun espace de noms ici. Malheureusement, lorsqu'il indique qu'il a trouvé un assignment il ne mentionne pas qu'il l'a trouvé dans un espace de noms par défaut qui diffère de l'absence d'espace de noms.

Solution

  • La grande majorité du temps : Ajouter elementFormDefault="qualified" à la xsd:schema de la XSD. Cela signifie que le XML valide doit placer les éléments dans l'espace de noms cible lorsqu'ils sont déclarés localement dans le XSD ; dans le cas contraire, le XML valide doit placer les éléments déclarés localement dans aucun espace de noms.
  • Une infime minorité de fois : Modifier le XML pour qu'il soit conforme aux XSD qui stipule que le assignment ne se trouve dans aucun espace de noms. Il est possible d'y parvenir, par exemple, en ajoutant xmlns="" à la assignment élément.

<strong>Crédits : </strong>Merci à <a href="https://stackoverflow.com/users/415448/michael-kay">Michael Kay </a>pour des commentaires utiles sur cette réponse.

72voto

Girish Points 191

Considérons le ComplexType suivant AuthorType utilisé par 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"

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 name 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ées comme locales à 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>

veuillez vous référer cette lien pour plus de détails

15voto

scorciatoia Points 153

Il est important de noter que l'élémentFormDefault s'applique aux éléments suivants localement éléments définis, 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="qualified", vous pouvez vous adresser à des éléments locaux du 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="qualified" 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 dans les éléments imbriqués à l'aide de l'attribut ref, ce qui se traduira par un schéma beaucoup moins compact.

Ce passage de l'ouvrage XML Schema Primer en parle : http://www.w3.org/TR/xmlschema-0/#NS

6voto

Farshid Miri Points 33

ElementFormDefault="qualified" 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="qualified", nous imposons l'utilisation de la déclaration d'espace de noms 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 souhaite pas qualifier les espaces de noms.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X