[..] Validation d'un fichier XML avec un schéma XSD

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

[..] Validation d'un fichier XML avec un schéma XSD

#1

Message par ZDS »

Bonjour !

Ca faisait un moment que je n'étais pas venu sur le forum AutoIt, ayant eu pas mal de boulot sur un projet personnel en AutoIt sans rencontrer de blocage (pour le contexte, il s'agit d'un script ouvert et gratuit en AutoIt pour un jeu en ligne - aka Dofus - dont le contenu reste en accord complet avec les CGUs du jeu).

Aujourd'hui je me heurte à un problème concernant un module de ce logiciel: comment (dans un script AutoIt) valider un fichier XML de configuration à l'aide d'un schéma XSD fourni, uniquement en local, et de préférence sans recoder un parseur à la mano? J'aurai pensé que l'utilisation de Microsoft.XMLDOM permettait ce genre de test, mais je n'ai rien trouvé ni ici (un seul topic contient le mot "XSD", et rien de notable), ni sur le forum anglais ("Je trouve pas" ... "j'ai trouvé, mais je dis pas comment").

Je ne veux pas réinventer la roue, ni la rendre carrée : juste une fonction qui rende true/false si le XML est conforme/non-conforme au XSD fourni (pas forcément besoin de savoir où est l'erreur).

Merci d'avance de votre aide !

ZDS

PJs :
- Fichier XML d'exemple avec 2 classes (Cra et Ecaflip) et une demi-douzaine de sorts chacun :
► Afficher le texteFichier XML
- Fichier XSD définissant la structure du fichier XML précédent :
► Afficher le texteFichier XSD
- Fichier AU3 d'exemple rendant un listing des sorts de la classe des Cras :
► Afficher le texteFichier AU3
- Resultat attendu :
Non valide, car l'attribut "bidon" n'existe dans aucune balise "classe".
Si on enlève la ligne <xs:attribute name="bidon" type="xs:string" use="required"/> du fichier XSD, le fichier devient valide par rapport au schéma.
Modifié en dernier par ZDS le mer. 23 mars 2011 09:34, modifié 2 fois.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#2

Message par GaRydelaMer »

Bonjour

regarde la doc de msxml sur le site de microsoft pour aller plus loin.

Sinon à tester:

Code : Tout sélectionner

Local $URL = "fichier.xml" ; Ton xml contient le lien vers le fichier schema

Local $MSXML_DOM_VERSION = 6
Local $xmlDoc = ObjCreate("Msxml2.DOMDocument." & $MSXML_DOM_VERSION  & ".0")
With $xmlDoc
    .async = False
    .validateOnParse = True ; C'est ici que le fichier est validé
    .preserveWhiteSpace = True
    .resolveExternals = False
    .validateOnParse = True
    If $MSXML_DOM_VERSION > 3 Then
        .setProperty("NewParser", True)
        .setProperty("ServerHTTPRequest", True)
        .setProperty("SelectionLanguage", "XPath")
    EndIf
    .load($URL)
    If .ParseError.ErrorCode <> 0 Then
        ; Si il y'a 1 erreur tu auras les informations ici
        ConsoleWrite($URL & @LF & "Erreur N° " & .ParseError.ErrorCode & @LF & StringStripWS(.ParseError.Reason, 7) & @LF)
        $xmlDoc = 0
    EndIf
EndWith

; Ensuite tu peux t'amuser avec le fichier xml, fais une recherche du fichier xmlsdk4.chm sur ta machine ou internet
; pour avoir l'aide des propriètès et méthode de l'objet $xmlDoc.
 
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#3

Message par ZDS »

Merci pour ta réponse,

Je me doutais du résultat, mais j'ai préféré tester en long en large et en travers avant de revenir : ta proposition ne permet que de tester et de récupérer une erreur présente dans la structure même du XML (une balise pas fermée, ou un guillemet mal placé, etc...), donc ok pour la validation du format XML, mais rien dans la validation propre à la XSD (le fichier peut ne pas exister, pour lui il a l'air de s'en balancer :s).

D'ailleurs, par une autre méthode, j'ai testé ceci :

Code : Tout sélectionner

    $XML.load($cheminFichierXML)
    Local $error = $XML.validate()
    MsgBox(0, "code:"&$error.errorCode, "reason:"&$error.reason)
Et le resultat obtenu est plus que contradictoire par rapport au test précédent : "code:-1072897500" / "reason:Échec de la validation car l'élément racine n'est pas associé à un DTD/schéma.", ce qui donne le même résultat que lorsque qu'on retire xsi:noNamespaceSchemaLocation="DamageCalc.xsd" de la seconde ligne du fichier XML. => A moins que je me plante, dans ce cas, c'est que le fichier XSD n'est même pas lu, on est d'accord? ^^

Il faut peut etre lui donner une adresse relative ou complète?

Je suis complètement paumé... :s Merci d'avance de votre aide.

ZDS
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#4

Message par Tlem »

Bonjour ZDS.
J'ai lu avec attention la première partie de votre message (car pour le reste j'ai vu que GaRydelaMer vous a répondu).

Concernant votre projet, je préfèrerais que vous ré-éditiez votre message et que vous fassiez votre publicité discrètement dans votre signature.

J'ai lu aussi sur l'accueil du site dont vous donnez le lien, les fonctionnalités de votre outil. Celui-ci ne peut pas être totalement considéré comme un bot de jeu, bien que la partie 'Les alertes' et 'Les boutons personnalisables' font partie d'après mon jugement à ce dont ce forum est frileux.
Je trouve cet outil un peu trop sur 'le fil du rasoir' pour être considéré comme un script normal.

De plus, si on lit bien les messages de Sylfaen, Seif' et Crevard Ingenieux, on sent bien qu'ils tolèrent ce genre d'outils, mais qu'ils ne peuvent le cautionner à 100% car 'trop évolutif'...

Bref. Il existe des tas d'autres sites en rapport direct avec les jeux tel que Dofus, donc je vous invite à faire toute votre promo sur ces sites et de continuer à demander de l'aide ici sans que la partie liée à Dofus apparaisse. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#5

Message par ZDS »

Bonjour Tlem,

J'ai retiré le lien du message d'accueil. C'est vrai que mon message pouvait faire office de publicité pour un logiciel tiers, mais mon but n'était pas là : Pensant qu'un jour ou l'autre, le but de mes demandes d'aide auraient été découvertes, je voulais tout simplement jouer carte sur table en disant que oui, c'est un logiciel lié à du jeu en ligne, mais en aucun cas pour du botting (contrairement à ce que tu penses des alertes et boutons customisables, ils n'ont en aucun cas d'impacts sur le client de jeu, uniquement un tooltip qui affiche un message comme un réveil, et une modularité de l'interface pour personnaliser le logiciel en lui même).

Bref, la question n'est pas là : En fait, la réponse de GaryDeLaMer ne résout pas le problème du tout. Un passage des deux fichiers dans Eclipse fait une validation correcte (que ce soit le XML lui même ou le rapport XML/XSD), mais AutoIt ne fait qu'un chargement de structure XML sans s'occuper du XSD. Que ce soit en traitant par des UDFs trouvées un peu partout, ou en reprenant des bouts de code VB sur MSDN et en les adaptant pour AutoIt, il continue à n'en faire qu'à sa tête.

Vu le problème rencontré, il est possible qu'AutoIt s'attende à voir un attribut autre que xsi:noNamespaceSchemaLocation="DamageCalc.xsd" car présent ou pas, il dit toujours qu'il n'y a pas de schéma associé, j'ai donc depuis essayé tous les patterns envisageables, et aucun ne semble lui plaire :s

Donc j'ai trois optiques :
- rester sur une XSD, et trouver les méthodes pour lancer cette validation comme il faut.
- changer pour une DTD, et perdre la finesse apportée par les XSD dans les validations.
- lacher AutoIt pour la partie validation, et la déléguer à un langage qui saurait le faire nativement.

J'espère que vous avez une piste à me faire explorer, là je ne vois même plus la lumière au bout ^^

Merci d'avance.

PS : Pour le coté ressenti de Sylfaen, une autre raison officieusement annoncée c'est surtout qu'Ankama ne peut pas se permettre de faire de la publicité d'un outil non corporate (en plus bien sur de ne pas avoir le temps de faire une validation à chaque évolution ou mise à jour), d'où le "accord de principe" que j'avais noté. Crevard et Seif étant de Jeux-OnLine, ils ne peuvent qu'appuyer une décision du studio Ankama Games.

EDIT : En fait, c'est bel et bien AutoIt qui pose problème, car une version traduite en VB de ton script fonctionne très bien (merci pour l'algo, ça se rapproche beaucoup de se que j'avais déjà). Le fait est qu'avec AutoIt, la validation par XSD ne se lance même pas, tu pourras mettre une image dans le champ noNamespaceSchemaLocation qu'il ne trouverait pas d'erreur. Par contre, il trouve bien les balises mal fermées ou les erreurs de syntaxe (désolé si je me répète).
J'ai aussi essayé en utilisant Eclipse et en faisant une validation en ligne pour comparer, en retirant un morceau de la ligne 6 du fichier XML :
- Par AutoIt avec un XSD absent : Aucune erreur détectée.
- Par AutoIt avec un XML non conforme au XSD : Aucune erreur détectée.
- En ligne (ou via Eclipse) avec un XSD absent : Ligne 2 - Schéma référencé manquant, veuillez fournir le contenu du schéma de validation.
- En ligne (ou via Eclipse) avec un XML non conforme au XSD : Ligne 6 - L'attribut 'type' n'est pas présent dans l'élément 'normal'.
Modifié en dernier par ZDS le mer. 23 mars 2011 17:02, modifié 1 fois.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#6

Message par Tlem »

Le domaine des XSD, DTD, etc ... m'est totalement inconnu, donc je ne vous serais pas d'une grande aide. Par contre d'autres membres me semble avoir suffisamment de compétences pour vous donner une solution ou simplement une direction de recherche. Il faudra être patient le temps que ceux-ci répondent à votre question. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#7

Message par GaRydelaMer »

Je pense que tu as tord d'incriminer AutoIt, en fait dans le code que je t'ai présenté avant AutoIt a rien à y voir (ou presque) puisque c'est le l'objet MSXML qui est créer.

http://support.microsoft.com/kb/307379

Voila un lien sur le site de microsoft qui explique comment le faire: à traduire en AuToIt:

Créez un objet XmlTextReader afin de lire un document XML
La propriété ValidationType de l'objet XmlValidatingReader indique le type de validation requis (DTD, XDR ou Schema).
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#8

Message par ZDS »

Hello,

Désolé de déterrer un sujet un peu vieillot (quoi que pas tant que ça).
J'ai eu beau tourner le schéma XSD et le fichier XML dans tous les sens, je n'ai rien pu en retirer.

Quelqu'un aurait-il un exemple construit typique en AutoIt sous la main? un truc tout bête qui prenne en charge un XML + une XSD et en face la validation ?

Merci d'avance de votre aide.

PJ: Exemples de base
► Afficher le texteXML
► Afficher le texteXSD
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
courzip
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 11 juil. 2012 11:45
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#9

Message par courzip »

Bonjour,

j'aurai besoin de votre aide.
je dois valider un flux xml ( voire tout un jeux de données ) avec le xsd correspondant.

vous n'auriez rien pour m'aider , car je débute.

merci
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#10

Message par ZDS »

Salut Courzip.

Désolé, mais je n'ai toujours pas trouver comment faire. Si par hasard je tombe sur des infos, je te tiendrai au courant.

A bientôt!
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
courzip
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 11 juil. 2012 11:45
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#11

Message par courzip »

Ce sont des bouts de script que j'ai récupérer :)
_XMLError est une focntion mais vous pouvez mettre un consolewrite


Func DomVersion()
For $x = 8 To 0 Step - 1
If FileExists(@SystemDir & "\msxml" & $x & ".dll") Then
$objDoc = ObjCreate("Msxml2.DOMDocument." & $x & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $x
;MsgBox(0,"domversion", $DOMVERSION)
ExitLoop
EndIf
EndIf
Next
EndFunc ;==>DomVersion


Func _XMLSchemaValidate($sXMLFile, $ns, $sXSDFile)

DomVersion()
Local $cache, $xmldoc
$cache = ObjCreate("Msxml2.XMLSchemaCache." & $DOMVERSION & ".0")
If Not IsObj($cache) Then
MsgBox(266288, "XML Error", "Unable to instantiate the XML object" & @LF & "Please check your components.")
Return SetError(-1)
EndIf
$cache.add ($ns, $sXSDFile)
$xmldoc = ObjCreate("Msxml2.DOMDocument." & $DOMVERSION & ".0")
If Not IsObj($xmldoc) Then
MsgBox(266288, "XML Error", "Unable to instantiate the XML object" & @LF & "Please check your components.")
Return SetError(-1)
EndIf

$xmldoc.async = False
$xmldoc.schemas = $cache
$name_file_xml = StringSplit($sXMLFile, "\") ; on split les "/"
$newFileXML =$rep_temp&"\"&$name_file_xml[$name_file_xml[0]]

Dircreate($rep_temp)

FileCopy($sXMLFile, $newFileXML)
$xmldoc.load($newFileXML)

global $NumLigneErreurXml = $xmlDoc.parseError.line
global $RaisonErreurXml = $xmldoc.parseError.reason
global $CodeErreurXml = $xmldoc.parseError.errorCode
global $TexteErreurXml = $xmlDoc.parseError.srcText


If Not ($xmldoc.parseError.errorCode = 0) Then

_XMLError("_XMLSchemaValidate:" & @LF & _
$sXMLFile & @LF & _
"Error: " & $CodeErreurXml & " " & $RaisonErreurXml & _ ;@LF & _
"line :" & $NumLigneErreurXml & " --> texte :"& $TexteErreurXml & @TAB &@CR & @CRLF )

Return SetError($xmldoc.parseError.errorCode)
EndIf

Return 0

EndFunc ;==>_XMLSchemaValidate
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#12

Message par blacksoul305 »

Salut,

ne pas oublier la balise code et spoiler ! ;)
Étudiant en 2ème année de Licence Informatique.
courzip
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 11 juil. 2012 11:45
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#13

Message par courzip »

j'ai de nouveau un problème sur cette fonction :
on ne remonte que la première erreur :

Code : Tout sélectionner

[spoiler=]
Func DomVersion()
      For $x = 8 To 0 Step - 1
            If FileExists(@SystemDir & "\msxml" & $x & ".dll") Then
                $objDoc = ObjCreate("Msxml2.DOMDocument." & $x & ".0")
                If IsObj($objDoc) Then
                    $DOMVERSION = $x
                    ;MsgBox(0,"domversion", $DOMVERSION)
                    ExitLoop
                EndIf
            EndIf
         Next
EndFunc   ;==>DomVersion
      
Func _XMLSchemaValidate($sXMLFile, $ns, $sXSDFile)


    DomVersion()
    Local $cache, $xmldoc
    $cache = ObjCreate("Msxml2.XMLSchemaCache." & $DOMVERSION & ".0")
    If Not IsObj($cache) Then
        MsgBox(266288, "XML Error", "Unable to instantiate the XML object" & @LF & "Please check your components.")
        Return SetError(-1)
     EndIf
    $cache.add ($ns, $sXSDFile)
    $xmldoc = ObjCreate("Msxml2.DOMDocument." & $DOMVERSION & ".0")
    If Not IsObj($xmldoc) Then
        MsgBox(266288, "XML Error", "Unable to instantiate the XML object" & @LF & "Please check your components.")
        Return SetError(-1)
     EndIf

    $xmldoc.async = False
    $xmldoc.schemas = $cache
    $name_file_xml = StringSplit($sXMLFile, "\") ; on split les "/"
    $newFileXML =$rep_temp&"\"&$name_file_xml[$name_file_xml[0]]

    Dircreate($rep_temp)


     
      FileCopy($sXMLFile, $newFileXML)
      $xmldoc.load($newFileXML)

        $date  = @MDAY & '/' & @Mon & '/' & @YEAR
        $heure = @Hour & ':' & @Min & ':' & @Sec
        $NumLigneErreurXml = $xmlDoc.parseError.line
        $RaisonErreurXml   = $xmldoc.parseError.reason
        $CodeErreurXml     = $xmldoc.parseError.errorCode
        $TexteErreurXml    = $xmlDoc.parseError.srcText


    If Not ($xmldoc.parseError.errorCode = 0) Then

         $status = "KO"
         local $erreur = "Erreur validation XML : " &  _
                  $sXMLFile & @CRLF & _
                  "Error : " & $CodeErreurXml  & " " & $RaisonErreurXml & _ ;@LF & _
                  "line : " & $NumLigneErreurXml & " --> texte :"& $TexteErreurXml & @CRLF

        Return SetError($xmldoc.parseError.errorCode)
   Else
       $status = "OK"
   EndIf

   Return 0

EndFunc   ;==>_XMLSchemaValidate
 
[/spoiler]
courzip
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mer. 11 juil. 2012 11:45
Status : Hors ligne

Re: [..] Validation d'un fichier XML avec un schéma XSD

#14

Message par courzip »

J'avance pas du tout.
Personne pour m'aider ? :twisted:
Répondre