66 votes

Schéma XML: élément racine

Le post suivant demande comment indiquer qu'un élément est l'élément racine un schéma XML:

Est-il possible de définir un élément racine d'un Document XML à l'aide de Schéma?

J'ai suivi le w3schools tutoriel sur le langage XML Schéma, mais quelque chose n'est pas encore clair. Examiner exemple de schéma à partir de 2 http://www.w3schools.com/schema/schema_example.asp (reproduit ci-dessous pour plus de commodité). Comment fonctionne ce code indiquent que <shiporder> est l'élément racine? N'est-ce pas l'exemple en disant que tous les éléments sont valables en tant que root éléments?

------------------ exemple ----------------------------------

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</xample saying that all elements are valid as root elements?quantity>
    <price>9.90</price>
  </item>
</shiporder> 

----------------------- schéma ------------------------

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

De mon point de vue d'un Schéma XML doit faire deux choses:

  1. définir ce qui peut se produire à l'intérieur de chaque nœud
  2. définir où chaque nœud peut être placé

Et il semble que l'exemple échoue au n ° 2. Toutes Les Suggestions?

62voto

Anony-Mousse Points 24646

Pour autant que je sais, tout à l'échelle mondiale défini élément peut être utilisé comme élément racine, et le Schéma XML n'a pas de notion de spécifier ce que l'élément racine est censé être.

Cependant, vous pouvez contourner ce problème en concevant votre Schéma XML bien, de sorte qu'il y a un seul globalement défini l'élément, puis seulement cet élément est valable tant que l'élément racine.

Un exemple de ceci peut être trouvé à W3Schools (rubrique à l'Aide de Types Nommés) Cet exemple n'a qu'un seul globalement défini élément, et il est donc possible de l'élément racine.

23voto

Michael Kay Points 52194

Pas tout le monde est d'accord avec ça, mais le fait que XML Schema ne pouvez pas spécifier un élément racine est par la conception. La pensée est que si un <invoice> est valable que lorsqu'il est la seule chose dans un document, il est tout aussi valide que si elle est contenue dans quelque chose d'autre. L'idée est que le contenu devrait être réutilisable, et vous ne devriez pas avoir le droit d'empêcher quelqu'un à l'aide de contenu valable dans le cadre de quelque chose de plus grand.

(Le fait que ID et IDREF sont limités à un document va à l'encontre de la présente politique; mais le langage a été conçu par un assez grand comité.)

19voto

davogotland Points 1985

Oui, tu as raison. le xsd doit être:

 <?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:complexType name="shiptoType">
  <xs:sequence>
    <xs:element name="name" type="xs:string" />
    <xs:element name="address" type="xs:string" />
    <xs:element name="city" type="xs:string" />
    <xs:element name="country" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemType">
  <xs:sequence>
    <xs:element name="title" type="xs:string" />
    <xs:element name="note" minOccurs="0" type="xs:string" />
    <xs:element name="quantity" type="xs:string" />
    <xs:element name="price" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string" />
      <xs:element name="shipto" type="shiptoType"/>
      <xs:element name="item" maxOccurs="unbounded" type="itemType"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>
 

comme vous le voyez, maintenant il n'y a qu'un xs:element , et celui-là est le seul qui peut être un élément racine valide :)

1voto

fullstackengineer Points 542

Comment ce code indique-t-il qu'il s'agit de l'élément racine?

John, ce schéma vient de définir tous les éléments et chacun d'entre eux peut être choisi comme élément racine. Si vous essayez de générer un exemple de fichier XML à partir d'un outil tel que Altova XML Spy ou son genre, vous pourrez choisir un élément comme élément racine.

Donc, chacun de ces éléments peut être la racine.

Pour éviter toute ambiguïté, utilisez un élément défini globalement.

1voto

xmlDave Points 1

L'inconvénient de nombreux éléments globaux est qu'ils peuvent tous être utilisés comme éléments racine pour les documents. L'avantage est alors que vous pouvez utiliser l'élément lors de la définition de nouveaux types, ce qui garantira que l'espace de noms des éléments enfants correspond à ceux du type parent.

J'ai changé de penser qu'il ne devrait y avoir qu'un seul élément global à que tous les types complexes devraient avoir un élément global.

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