web-dev-qa-db-fra.com

Que fait elementFormDefault dans XSD?

Que fait elementFormDefault et quand doit-il être utilisé?

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

qualifié - les éléments et attributs sont dans le targetNamespace du schéma

non qualifié - les éléments et attributs n'ont pas d'espace de nom

Donc, à partir de cette définition, je penserais 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 que vous auriez même un ensemble à qualifier non qualifié pour cette question? J'ai essayé Googling, mais je n'ai eu que quelques pages du W3C extrêmement difficiles à comprendre.

C'est le fichier sur lequel je travaille en ce moment, pourquoi dois-je déclarer le type en tant que target:TypeAssignments quand je déclare le targetNamespace comme identique à 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>
80
Levi

ElementFormDefault n'a rien à voir avec les espaces de noms des types du schéma, il s'agit des espaces de noms des éléments des documents XML 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 le targetNamespace que vous avez déclaré en haut du schéma s'applique uniquement aux éléments du document XML conforme au schéma si elementFormDefault est "qualifié" ou si l'élément est déclaré explicitement dans le schéma comme ayant form = "qualifié". .

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

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

mettra les éléments "name" attendus dans l’espace targetNamespace et les éléments "page" dans l’espace de noms null.

Pour vous éviter de mettre form = "qualifié" sur chaque déclaration d'élément, la déclaration de elementFormDefault = "qualifié" signifie que le targetNamespace s'applique à chaque élément, sauf substitution, en insérant form = "unqualified" dans la déclaration d'élément.

67
Alohci

Considérez le ComplexType AuthorType suivant utilisé par l'élément 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"

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 name de l'auteur est autorisé sans spécifier l'espace de nom (non qualifié). Tout élément faisant 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>

s'il vous plaît se référer this lien pour plus de détails

54
Girish

Nouvelle réponse détaillée et explication d'une vieille question fréquemment posée ...

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

Il y a beaucoup de confusion à propos de 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:

  • L'élément assignment est défini localement.
  • Les éléments définis localement dans XSD ne sont dans aucun espace de nom par défaut.
    • En effet, la valeur par défaut de elementFormDefault est unqualified.
    • Ceci est sans doute une erreur de conception par les créateurs de XSD.
    • La pratique standard consiste à toujours utiliser elementFormDefault="qualified" de sorte que assignment se trouve dans l’espace de noms cible comme on pourrait s’y attendre.

XML apparemment valide

Ce XML ressemble à ce qu'il 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>

Avis:

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

Erreur de validation complexe

En dépit de sa validité, le code XML ci-dessus génère l'erreur de validation confuse suivante:

[Erreur] try.xml: 4: 23: cvc-complex-type.2.4.a: Un contenu invalide a été trouvé à partir de l'élément 'assignation'. Un des '{affectation}' est attendu.

Notes:

  • Vous ne seriez pas le premier développeur à maudire ce diagnostic qui semble indiquer que le contenu n'est pas valide car il s'attend à trouver un élément assignment mais il a en fait trouvé un élément assignment element. ( WTF )
  • Qu'est-ce que cela signifie réellement: le { et } autour de assignment signifie que la validation attendait assignment dans aucun espace de nom ici. Malheureusement, quand il dit avoir trouvé un élément assignment, il ne mentionne pas qu'il l'a trouvé dans un espace de noms par défaut qui diffère de aucun espace de noms.

Solution

  • La plupart du temps: Ajouter elementFormDefault="qualified" au xsd:schema élément de la XSD. Cela signifie qu'un XML valide doit placer des éléments dans l'espace de nom cible lors de la déclaration locale dans le fichier XSD. sinon, un XML valide doit placer les éléments déclarés localement dans aucun espace de nom.
  • Minuscule minorité du temps: Modifiez le code XML pour qu'il soit conforme à l'exigence de XSD selon laquelle assignment ne doit pas figurer dans un espace de noms. Ceci peut être réalisé, par exemple, en ajoutant xmlns="" à l'élément assignment.
38
kjhughes

Il est important de noter que elementFormDefault s'applique aux éléments définis localement localement, généralement nommés dans un bloc complexType, par opposition aux éléments globaux définis dans la partie supérieure. niveau du schéma. Avec elementFormDefault = "qualifié", vous pouvez adresser des éléments locaux du schéma à partir du document xml en utilisant l'espace de nom cible du schéma comme espace de nom par défaut du document.

En pratique, utilisez elementFormDefault = "qualifié" pour pouvoir déclarer des éléments dans des blocs imbriqués. Dans le cas contraire, 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 à l'aide de l'attribut ref. schéma beaucoup moins compact.

Ce bit dans XML Schema Primer en parle: http://www.w3.org/TR/xmlschema-0/#NS

12
stephan f

elementFormDefault = "qualifié" est utilisé pour contrôler l'utilisation des espaces de noms dans les documents d'instance XML (fichier .xml), plutôt que des espaces de noms dans le document de schéma lui-même (fichier .xsd).

En spécifiant elementFormDefault = "qualifié", nous appliquons la déclaration d'espace de nom à 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 attributFormDefault = "non qualifié" est la valeur par défaut, il n’est pas nécessaire de le spécifier dans le document de schéma, si l’on ne souhaite pas qualifier les espaces de noms.

5
Feri

J'ai remarqué que XMLSpy (version 2011 minimum) a besoin d'un targetNameSpace défini si elementFormDefault = "qualifié" est utilisé. Sinon, ne pas valider. Et aussi ne générera pas de XML avec les préfixes d'espace de noms

0
Neal