Salut,

je n'ai pas utilisé xsd depuis ~6 ans, j'essaye de valider un xml (relativement simple), et bien sûr ça passe pas : mon xsd n'est même pas valide

Voilà à quoi ressemble un xml valide simple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<List file="toto.h">
  <Node name="MyNode1">
    <Member name="abc" type="bool" />
    <Member name="def" type="int32" collection="array" maxsize="42" />
  </Node>
  <Node name="MyNode2">
    <Member name="abc" type="int32" min="0" max="8" />
    <Member name="def" type="float64" decimals="5" />
  </Node>
  <Node name="MyNode3" />
</List>
Et les règles dégrossises:
- un xml contient un List avec un file
- le List contient des Node
- chaque Node a un name et peut contenir des Member
- Member a forcément un nom
- Member a forcément un type dans la liste bool, int32, float64
- Certains types peuvent avoir des attributs supplémentaires, certains optionnels, d'autres pas
- Member peut avoir une collection, dans ce cas il doit avoir un maxsize

Voilà où je suis rendu (qui est surement moche):
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="Integer_1_10">
	<xs:restriction base="xs:unsignedByte">
		<xs:minInclusive value="1" />
		<xs:maxInclusive value="10" />
	</xs:restriction>
</xs:simpleType>
<!-- Collections -->
<xs:simpleType name="BaseCollection">
	<xs:restriction base="xs:string">
		<xs:enumeration value="array" />
		<xs:enumeration value="vector" />
	</xs:restriction>
</xs:simpleType>
<xs:complexType name="Collection">
	<xs:attribute name="name" type="xs:string" use="required" />
	<xs:attribute name="collection" type="BaseCollection" use="required" />
	<xs:attribute name="maxsize" type="xs:unsignedInt" use="required" />
</xs:complexType>
<!-- Types -->
<xs:complexType name="Bool">
	<xs:attribute name="name" type="xs:string" use="required" />
	<xs:attribute name="type" type="xs:string" fixed="bool" use="required" />
</xs:complexType>
<xs:complexType name="Int32">
	<xs:attribute name="name" type="xs:string" use="required" />
	<xs:attribute name="type" type="xs:string" fixed="int32" use="required" />
	<xs:attribute name="min" type="xs:int" use="optional" />
	<xs:attribute name="max" type="xs:int" use="optional" />
</xs:complexType>
<xs:complexType name="Float64">
	<xs:attribute name="type" type="xs:string" fixed="float64" use="required" />
	<xs:attribute name="decimals" type="Integer_1_10" use="required" />
</xs:complexType>
 
<!-- Collection of types -->
<xs:complexType name="Int32Collection">
	<xs:complexContent>
		<xs:extension base="Int32">
			<xs:attribute name="collection" type="BaseCollection" use="required" />
			<xs:attribute name="maxsize" type="xs:unsignedInt" use="required" />
		</xs:extension>
	</xs:complexContent>
</xs:complexType>
 
<xs:element name="Member">
	<xs:complexType>
		<xs:choice>
			<xs:element name="Member" type="Bool" />
			<xs:element name="Member" type="Int32" />
			<xs:element name="Member" type="Int32Collection" />
			<xs:element name="Member" type="Float64" />
		</xs:choice>
	</xs:complexType>
</xs:element>
 
<xs:element name="Node">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="Member" type="Member" />
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" use="required" />
	</xs:complexType>
</xs:element>
 
<xs:complexType name="List">
	<xs:sequence>
		<xs:element name="Node" type="Node" />
	</xs:sequence>
	<xs:attribute name="file" type="xs:string" use="required" />
</xs:complexType>
 
</xs:schema>
L'idée, si tenté que cela soit possible, était de créer différent types pour supporter les cas, puis avoir un méta-type qui soit un type parmi ceux-là et utilisé comme sequence pour Node::Member.

Seulement quand je le teste sur http://www.utilities-online.info/xsd.../#.WqK3yujFKUk
Error line 69 : cannot resolve the name "Member"
Qui est pourtant déclaré un peu plus haut.
Je suis peut-être proche du résultat, ou pas du tout, ou ce que je veux faire est impossible, mais ça fait bien 2h que je bloque à ce stade maintenant, toute aide est la bienvenue !