Bonjour,
je dois réaliser la validation d'un fichier XML à l'aide d'un schéma XSD imposé par un fournisseur.
Pour cela j'utilise la librairie libxml2 version 2.9.4 et msxml6 sous Windows et j'obtiens des résultats différents.
Avec libxml2 le fichier XML n'est pas valide ni sous Windows ni sous Linux.
Avec MSXML6 le fichier XML est considéré valide.
Ci-dessous des exemples simplifiés. Pour valider facilement le fichier XML avec le XSD, j'utilise Microsoft Visual Studio (msxml) et je compare avec Notepad++ (plugin XMLTools qui utilise apparemment libxml2).
Fichier XML :
Fichier XSD :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?xml version="1.0" encoding="utf-8"?> <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:root="http://www.xmlValidation.com/root" xsi:schemaLocation="./schema_strict.xsd"> <object identifier="1ABC001DE"/> </root>
En ajoutant un "?" à la fin du pattern de contrôle, la validation est ok avec libxml et msxml : \d\p{Lu}\p{Lu}\p{Lu}\d\d\d\p{Lu}\p{Lu}(\p{Lu}|\d|)?
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 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:complexType name="codeType"> <xs:attribute name="identifier" use="required"> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:maxLength value="10"/> <xs:pattern value="\d\p{Lu}\p{Lu}\p{Lu}\d\d\d\p{Lu}\p{Lu}(\p{Lu}|\d|)"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="object" type="codeType" minOccurs="0"> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
N'étant pas du tout à l'aise avec les expressions régulières et les XSD j'ai besoin d'aide sur ce sujet.
D'après vous est-ce que libxml est plus strict que msxml ? est-ce l'interprétation de l'expression régulière est ambiguë ?
Merci !
Partager