Bonjour,
Tout d'abord, je précise que je me lance dans l'écriture de schémas XML aussi je ne suis pas encore très à l'aise, ni sur d'utiliser les bons termes à la suite. N'hésitez pas à me corriger si besoin.
Le schéma que j'ai écrit s'applique à des fichiers XML qui décrivent des modèles de données. On y décrit des objets géographiques et notamment leurs propriétés/attributs (élément <field> à la suite - je vous épargne le schéma dans sa totalité, ce n'est à priori pas utile).
Quelques exemples d'éléments XML correspondants pour fixer les idées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 <xsd:complexType name="val_type"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="description" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:element name="field"> <xsd:complexType> <xsd:all> <xsd:element name="key" type="key_type"/> <xsd:element name="name" type="xsd:string" minOccurs="0"/> <xsd:element name="mandatory" type="empty" minOccurs="0"/> <xsd:element name="private" type="empty" minOccurs="0"/> <xsd:element name="help" type="xsd:string" minOccurs="0"/> <xsd:element name="typedef"> <xsd:complexType> <xsd:sequence> <xsd:element name="type" type="data_type"/> <xsd:element name="size" type="string_size" minOccurs="0"/> <xsd:element name="count" type="xsd:positiveInteger" minOccurs="0"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="predefined" type="empty" minOccurs="0"/> <xsd:element name="val" type="val_type" minOccurs="0"/> <xsd:element name="default" type="xsd:string" minOccurs="0"/> <xsd:element name="mode" type="mode_type" minOccurs="0"/> <xsd:element name="precision" type="xsd:nonNegativeInteger" minOccurs="0"/> <xsd:element name="min" type="xsd:string" minOccurs="0"/> <xsd:element name="max" type="xsd:string" minOccurs="0"/> <xsd:element name="step" type="xsd:string" minOccurs="0"/> </xsd:all> </xsd:complexType> </xsd:element>
Le schéma semble syntaxiquement correct (via xmllint, j'ai validé des modèles de données (XML) et le schéma, après plusieurs essais infructueux, a été chargé sans erreur). Mais, pour l'élément <field>, j'ai du rester très "coulant" pour le type de certains sous éléments en utilisant xsd:string comme type et je n'en suis pas très satisfait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <field> <key>ACC</key> <name>Type de precision [1]</name> <help>Accuracy Category [1]</help> <typedef><type>shrt</type></typedef> <predefined/> <val description="Accurate">1</val> <val description="Approximate">2</val> <default>1</default> </field> <field> <key>NAM</key> <name>Nom [UNK]</name> <help>Name [UNK]</help> <typedef><type>pstr</type><size>200</size></typedef> <val description="Unknown">UNK</val> <default>UNK</default> </field>
Dans le XML, les types de certains éléments peuvent dépendre du contenu (la partie "texte") d'un autre élément : val, default dépendent du contenu de type (l'élément de nom type).
Peut-être les fichiers XML correspondants ont-ils été, à l'origine, mal conçus/pensés mais ils sont utilisés depuis un bon bout de temps et par de nombreuses applications : il n'est guère envisageable d'en changer, sauf à reprendre toutes les applications les utilisant ...
Comment rendre "plus strict" (et est-ce même possible ?) le schéma pour que, par exemple, quand <type> contient "shrt" (entier sur 2 octets), un élément <val> contenant le texte "abcd" fasse couiner le validateur utilisant le schéma (et n'accepte que des valeurs de "-32768" à "32767") ?
Quelquechose qui marchera, à coup sur, c'est de prévoir autant de type pour <field> qu'il y a de possibilités pour le contenu/texte de <type> et, dans l'élément parent, utiliser un "choice" mais j'ai ... 15 types différents ...
Est-ce qu'il faut "jongler" avec de nombreuses déclarations de types (simple et/ou complexe) et d'éléments (les "all", "sequence", "choice", etc... je n'ai pas encore en tête toutes les possibilités) ou y a-t-il un "mécanisme" déjà prévu qui répondrait à mon problème ?
Merci d'avance pour vos réponses
Partager