bonjour a tous et toutes,
J'ai pris l'initiative d'utiliser xml et xsd dans un projet car les fichier xml sont susceptibles d'être modifiés par le client.
Ce logiciel permet de lancer des série de tests pour valider le bon fonctionnement d'un système embarqué. Il y a une vingtaine de tests et chacun de ces test a un fichier xml (et xsd) permettant de spécifier une liste de:
- nom de la valeur a tester
- valeur attendu
Les fichiers xsd sont quasiment identiques et j'aimerais pouvoir mettre en commun un maximum de 'code' xsd.
Voici deux couple de fichier xml et xsd corespondant a deux test, cela montre bien mon soucis :
1.a) xml du test batterie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?xml version="1.0" encoding="utf-8" ?> <TestInput xmlns="http://tempuri.org/BT_TEST_BACKUP_BATTERY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/BT_TEST_BACKUP_BATTERY BT_TEST_BACKUP_BATTERY.xsd" Description="Test de la pile de backup de la carte"> <TestEqual Name="Tension de la pile quand la carte est alimentée" Expected="3.1" Tolerance="0.2"/> <TestEqual Name="Tension de pile quand la carte nest pas alimentée" Expected="0.5" Tolerance="0"/> </TestInput>
1.b) schema validant ce xml
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 <?xml version="1.0" encoding="utf-8" ?> <xs:schema id="BT_TEST_BACKUP_BATTERY" targetNamespace="http://tempuri.org/BT_TEST_BACKUP_BATTERY" elementFormDefault="qualified" xmlns="http://tempuri.org/BT_TEST_BACKUP_BATTERY" xmlns:mstns="http://tempuri.org/BT_TEST_BACKUP_BATTERY" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="TestInput"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:group ref="TestType"/> </xs:sequence> <xs:attribute name="Description" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:group name ="TestType"> <xs:choice> <xs:element name="TestRange" type="TestRangeType"/> <xs:element name="TestEqual" type="TestEqualType"/> <xs:element name="TestLess" type="TestLessType"/> </xs:choice> </xs:group> <xs:complexType name="TestEqualType"> <xs:complexContent> <xs:extension base="TestEqualBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestRangeType"> <xs:complexContent> <xs:extension base="TestRangeBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestLessType"> <xs:complexContent> <xs:extension base="TestLessBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestEqualBaseType"> <xs:attribute name="Expected" type="xs:string" use="required" /> <xs:attribute name="Tolerance" type="xs:double" /> </xs:complexType> <xs:complexType name="TestRangeBaseType"> <xs:attribute name="MinInclusiveValue" type="xs:string" use="required" /> <xs:attribute name="MaxInclusiveValue" type="xs:string" use="required" /> </xs:complexType> <xs:complexType name="TestLessBaseType"> <xs:attribute name="MaxExclusiveValue" type="xs:string" use="required" /> </xs:complexType> <xs:simpleType name="TestsAllowed"> <xs:restriction base="xs:string"> <xs:enumeration value="Tension de la pile quand la carte est alimentée" /> <xs:enumeration value="Tension de pile quand la carte nest pas alimentée" /> </xs:restriction> </xs:simpleType> </xs:schema>
2.a) xml du test de mesure des volages
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?xml version="1.0" encoding="utf-8" ?> <TestInput xmlns="http://tempuri.org/BT_MEAS_VOLTAGE_POWER" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/BT_MEAS_VOLTAGE_POWER BT_MEAS_VOLTAGE_POWER.xsd" Description="Mesure des tensions et des courants consommés via le processeur ARM7 présent sur la carte du banc de test"> <TestRange Name="Vext charge" MinInclusiveValue="3.9" MaxInclusiveValue="4.5"/> <TestEqual Name="Tension 3.3V" Expected="3.3" Tolerance="0.1"/> <TestEqual Name="Tension 1.2V" Expected="1.2" Tolerance="0.1"/> </TestInput>
2.b) schema validant ce xml
Comme vous le constates la seule différence entre les deux fichier xsd est le simpleType "TestsAllowed".
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" encoding="utf-8" ?> <xs:schema id="BT_MEAS_VOLTAGE_POWER" targetNamespace="http://tempuri.org/BT_MEAS_VOLTAGE_POWER" elementFormDefault="qualified" xmlns="http://tempuri.org/BT_MEAS_VOLTAGE_POWER" xmlns:mstns="http://tempuri.org/BT_MEAS_VOLTAGE_POWER" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="TestInput"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:group ref="TestType"/> </xs:sequence> <xs:attribute name="Description" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:group name ="TestType"> <xs:choice> <xs:element name="TestRange" type="TestRangeType"/> <xs:element name="TestEqual" type="TestEqualType"/> <xs:element name="TestLess" type="TestLessType"/> </xs:choice> </xs:group> <xs:complexType name="TestEqualType"> <xs:complexContent> <xs:extension base="TestEqualBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestRangeType"> <xs:complexContent> <xs:extension base="TestRangeBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestLessType"> <xs:complexContent> <xs:extension base="TestLessBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestEqualBaseType"> <xs:attribute name="Expected" type="xs:string" use="required" /> <xs:attribute name="Tolerance" type="xs:double" /> </xs:complexType> <xs:complexType name="TestRangeBaseType"> <xs:attribute name="MinInclusiveValue" type="xs:string" use="required" /> <xs:attribute name="MaxInclusiveValue" type="xs:string" use="required" /> </xs:complexType> <xs:complexType name="TestLessBaseType"> <xs:attribute name="MaxExclusiveValue" type="xs:string" use="required" /> </xs:complexType> <xs:simpleType name="TestsAllowed"> <xs:restriction base="xs:string"> <xs:enumeration value="Tension 3.3V" /> <xs:enumeration value="Tension 1.2V" /> <xs:enumeration value="Vext charge" /> </xs:restriction> </xs:simpleType> </xs:schema>
Les seules parties que j'ai reussi a mettre en commun uniquement estTestEqualBaseType, TestRangeBaseType et TestLessBaseType. Il m'est dont possible de les mettre dans un fichier xsd qui est importé () dans chaqu'un de mes tests, toutefois le code dupliqué reste important a savoir:
J'ai longtemps cherché a m'en sortir en reproduisant le mecanisme d'heritage ce qu'on appele les methode virtuel en c++. Mais il me semble que xsd ne permet pas de le faire.
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 <xs:element name="TestInput"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:group ref="TestType"/> </xs:sequence> <xs:attribute name="Description" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:group name ="TestType"> <xs:choice> <xs:element name="TestRange" type="TestRangeType"/> <xs:element name="TestEqual" type="TestEqualType"/> <xs:element name="TestLess" type="TestLessType"/> </xs:choice> </xs:group> <xs:complexType name="TestEqualType"> <xs:complexContent> <xs:extension base="TestEqualBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestRangeType"> <xs:complexContent> <xs:extension base="TestRangeBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TestLessType"> <xs:complexContent> <xs:extension base="TestLessBaseType" > <xs:attribute name="Name" type="TestsAllowed" use="required" /> </xs:extension> </xs:complexContent> </xs:complexType>
Peut être avez vous une solution a me proposer pour garder un couple xsd/xml par test avec un minimum de code redondant entre les fichier xsd.
Merci de m'avoir lu, j'espère avoir été assez clair.
Partager