1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 2
    Points : 2
    Points
    2

    Par défaut Différence de comportement valideur / parseur xml

    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 :
    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>
    Fichier XSD :
    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>
    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|)?

    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 !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 488
    Points : 19 498
    Points
    19 498

    Par défaut

    Hello,

    La définition des regexes en XML Schema n'est pas ambiguë. En tout cas pas sur ce point-là et à ma connaissance elle ne l'est pas du tout.
    D'après les définitions, ce XML est valide même sans mettre de ? à la fin (et d'ailleurs c'est assez bizarre que mettre un ? à la fin fasse solution pour le validateur qui n'est pas d'accord sans.)

    Donc voilà, celui qui ne valide pas se trompe.

    Cela dit, ça reste assez pourri de faire une regex avec un | et rien à droite (et ce serait pas mieux à gauche.)

    En gros, a|b| et rien à droite du dernier | c'est une regex qui accepte soit a, soit b, soit une chaîne vide.
    Ce qui veut dire aussi que ça accepte soit a, soit b, soit leur absence. C'est quand même pas facile à lire. Pour faire la même chose, on préfèrera :

    Une regex qui accepte, soit a, soit b, mais bon c'est optionnel. On accepte aussi qu'ils ne soient pas là.

    C'est une question de lisibilité, de pouvoir être compris par la prochaine personne qui lira ça.

    Pour le validateur, les deux devraient fonctionner. Pour l'humain, c'est le deuxième qu'il faut utiliser.

    Au passage, ton xsi:schemaLocation est incorrect : ça s'utilise pour valider des namespaces, et ton document n'a pas de namespace.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 217
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 217
    Points : 2 132
    Points
    2 132

    Par défaut

    [0]
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:root="http://www.xmlValidation.com/root"
    xsi:schemaLocation="./schema_strict.xsd">
    Cette ligne est en elle-même déjà non valide. xsi est un namespace qu'on nomme parfois un namespace dit bien-connu. Et ça veut dire qu'on n'a pas besoin de fournir explicitement un schéma pour xsi et le moteur de validation pourrait valider des infos relatés à ce namespace. Mais, ce n'est pas forcé, et pour certaines implémentataions, le moteur peut ne pas le faire: donc, un peu de dépendant d'implémentation s'introduit par là.

    La syntaxe en question est ceci
    xsi:schemaLocation="./schema_strict.xsd"
    ce qui est fausse. La syntaxe propre est ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:schemaLocation="http://www/xmlValidation.com/root ./schema_strict.xsd"
    si on pense il s'agit que le seul namespace explicitement montré soit en question.

    msxml2 version 6.0 ou d'autres intervient pro-activement en validant aussi le namespace bien-connu; par conséquence, il refuse de valider totalement la combinaison xml et xsd, déjà à ce niveaux.
    libxml2, non: il va laisser passer, il me semble.

    [1]
    Il faut absolument mettre le facet ? dans le pattern. Ce qui est fourni est faux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!-- xs:pattern value="\d\p{Lu}\p{Lu}\p{Lu}\d\d\d\p{Lu}\p{Lu}(\p{Lu}|\d|)"/ -->
    <xs:pattern value="\d\p{Lu}\p{Lu}\p{Lu}\d\d\d\p{Lu}\p{Lu}(\p{Lu}|\d)?"/>
    msxml2 v6 et libxml2 ont tout deux raison.

    [2]
    Juste une remarque supplémentaire pour ceux qui se sentissent confus si l'élément root est dans un namespace ou dans un namespace dit nul. La ligne peut sentir royalement confus. L'élément root est sans namespace (ou dans un namespace nul) et c'est pour ça, dans le schéma, on ne met pas un @targetNamespace et c'est correctement fait.

    Pourtant, on a la main libre aussi de déclarer un préfixe root par xmlns:root. On peut le servit un jour ou dans un xml plus complet mais dans le cas montré il n'intervient aucunement nul part - et c'est permit aussi, si on veut.

    Voilà !

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 488
    Points : 19 498
    Points
    19 498

    Par défaut

    Citation Envoyé par tsuji Voir le message
    Il faut absolument mettre le facet ? dans le pattern. Ce qui est fourni est faux.
    Hum. Dans ma réponse au-dessus je dis que c'est effectivement mieux avec un ? mis comme ça qu'avec l'exemple de départ.

    Mais je dis aussi que ça marche avec l'exemple de départ, c'est juste pas du code de qualité.

    Dans les deux cas avec justification.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 217
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 217
    Points : 2 132
    Points
    2 132

    Par défaut

    Si libxml2 refuse de l'accepter n'est pas une raison suffisante, je prends refuge dans le critère du dénominateur commun minimal... En tout cas le support de la regex de xsd n'est qu'une sous-ensemble de la regex de toute l'étendue imaginable et xsd n'a jamais caché cela. Même dans le domaine de regex propre, le facet ? aurait eu mon vote pour. En fin de compte, c'est comme vous voulez.

  6. #6
    Membre chevronné Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 1 183
    Points : 2 238
    Points
    2 238

    Par défaut

    Moi ce qui me fait le plus tiquer c'est la non-utilisation des quantificateurs, ça va que la pattern est relativement courte et simple. Pour ma part, je l'écrirai comme ça:\d\p{Lu}{3}\d{3}\p{Lu}{2}[\p{Lu}\d]? (plus pour bien voir le nombre de répétitions que pour gagner de la place).
    "Ça s'laisse boire!" - Bérénice du Syphon

Discussions similaires

  1. Selon vous, le meilleur parseur XML ?
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 22
    Dernier message: 05/06/2012, 12h39
  2. copier coller fichier xml différences de comportement
    Par cotede2 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 09/06/2009, 12h27
  3. Parseur XML to Java pour creation de Class
    Par yannick101 dans le forum XML
    Réponses: 1
    Dernier message: 18/07/2005, 14h20
  4. [JFrame] Explication sur une différence de comportement
    Par jems dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 06/07/2005, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo