web-dev-qa-db-fra.com

Récursivité dans un schéma XML?

J'ai besoin de créer un schéma XML qui valide une structure arborescente d'un document XML. Je ne connais pas exactement les occurrences ou le niveau de profondeur de l'arbre.

Exemple XML:

<?xml version="1.0" encoding="utf-8"?>
<node>
  <attribute/>
  <node>
    <attribute/>
    <node/>      
  </node>
</node> 

Quelle est la meilleure façon de le valider? Récursivité?

46
Miguel Mulero

si vous avez besoin d'une déclaration de type récursive, voici un exemple qui pourrait vous aider:

<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="node" type="nodeType"></xs:element>

  <xs:complexType name="nodeType">    
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="node" type="nodeType"></xs:element>
    </xs:sequence>
  </xs:complexType>

</xs:schema>

Comme vous pouvez le voir, cela définit un schéma récursif avec un seul nœud nommé "nœud" qui peut être aussi profond que souhaité.

66
Dani Duran

XSD permet en effet la récursivité des éléments. Ici est un exemple pour vous

<xsd:element name="section">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="title"/>
      <xsd:element ref="para" maxOccurs="unbounded"/>
      <xsd:element ref="section" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Comme vous pouvez le voir, l'élément section contient un élément enfant de type section.

40
Michael Brown