IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Valider XML Discussion :

Diff�rence de comportement valideur / parseur xml


Sujet :

Valider XML

  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
    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
    12 582
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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
    12 582
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    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).

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 Format d'�change (XML, JSON...)
    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