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>
Était-ce utile?

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 est unqualified.
    • 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 que assignment est dans l'espace de noms cible comme on le ferait attendre.

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ément assignment. ( WTF )
  • Ce que cela signifie vraiment: Le { et } autour assignment signifie que la validation attendait assignment dans aucun espace de noms ici. Malheureusement, quand il dit qu'il a trouvé un élément assignment, 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ément xsd: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 ajoutant xmlns="" à l'élément de assignment.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top