Question

J'ai toujours compris XMLSchemas et DTDs être équivalents, mais que celui-ci est plus difficile à utiliser lors de la modélisation des relations complexes (comme l'héritage).

Récemment je voulais construire un schéma pour valider les documents qui ont une structure comme ceci:

<data>
 <array>
   <int></int>
   <int></int>
 </array>
 </array>
   <float></float>
   <float></float>
 </array>
 <int><int>
 <float></float>
</data>

Les éléments à l'intérieur peuvent apparaître dans l'ordre et chacun est de cardinalité 0 .. * En utilisant XMLSchema, si je définir un type complexe en utilisant Je peux avoir les éléments de commande, mais la cardinalité maximale est 1. et sont les autres candidats évidents mais ils sont plus restrictive que ce que je veux.

Je remarquai alors qu'une DTD semble être en mesure d'y parvenir comme ceci:

<!ELEMENT data (array | float | int)*>

Est-il possible de construire un schéma équivalent ou dois-je utiliser ici DTDs?

Était-ce utile?

La solution 2

Je pensais que je reviens à ce que la réponse précédente est incorrecte. Enfait, on peut résoudre le problème d'origine à l'aide du schéma XML.

L'approche correcte consiste à définir un élément de groupe qui est contient un choix entre toutes les différentes options (ints, flotteurs, tableaux) et chacun a cardinalité 0 .. *.

<xs:group name="dataTypesGroup">
    <xs:choice>
        <xs:element name="int" type="intType"/>
        <xs:element name="float" type="floatType"/>
        <xs:element name="array">
            <xs:complexType>
                <xs:choice>
                    <xs:element name="int" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="float" type="xs:float" minOccurs="0" maxOccurs="unbounded"/>
                </xs:choice>
                <xs:attribute name="id" use="required"></xs:attribute>
            </xs:complexType>    
        </xs:element>
    </xs:choice>
</xs:group>

A partir de là, il reste à faire référence au groupe dans une définition complexType et définir la cardinalité du groupe comme 0 .. *

<xs:element name="data" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
        <xs:group ref="dataTypesGroup" minOccurs="0" maxOccurs="unbounded"/>
    </xs:complexType>
</xs:element>

et le tour est joué. un peu bavard (en particulier par rapport à la syntaxe de RelaxNG), mais la hausse est que le schéma XML est beaucoup mieux pris en charge. J'avais conçu un analyseur à base RelaxNG pour résoudre le problème d'origine, mais les validateurs disponibles (comme jing) sont un peu plus maladroit que d'utiliser le schéma XML basé sur des outils livrés avec Java et al.

Autres conseils

Il est seulement réalisable au moyen de XSD si vous gardez l'ordre de vos éléments (vous pouvez utiliser un xs: séquence ). Je veux dire, float toujours venir après un array (le cas échéant), et et un int toujours venir après flottant (le cas échéant), en tenant compte du fait que vous pouvez répéter autant de ocurreces que vous le souhaitez de chaque type (ou les complètement avec omission).

La raison en est que XSD xs: all type complexe ne prend pas en charge unbounded attribut pour l'un de ses types de contenu (éléments, d'autres types de groupes imbriqués, etc.). Autre plus schéma « détendu » vous permettra de le faire, comme DTD, comme vous l'avez, ou RelaxNG par exemple.

Voici un exemple XSD qui correspond à votre fichier XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="arrayType">
            <xs:sequence>
                <xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="int" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="float" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
    </xs:complexType>
    <xs:element name="data" type="arrayType"/>
</xs:schema>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top