Bonjour la communauté,
Je vous explique mon cas. Je travaille avec des fichiers XML que je dois valider avec un fichier XSD. J'utilise le DOM XML avec la bibliothèque MSXXML.
Mon code actuelle ressemble à ça :
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 vSchema := CoDOMDocument60.Create; vSchema.async := False; vSchema.load(XSDFilename); vSchemaCollection := CoXMLSchemaCache60.Create; vSchemaCollection.add(NameSpaceSchema, vSchema); vXML := CoDOMDocument60.Create; vXML.async := False; vXML.validateOnParse := True; vXML.schemas := vSchemaCollection; vXML.loadXML(XMLText); CheckValidationError(vXML.parseError);Les fonctions font leur boulot et me retourne une exception dès qu'elle trouve une erreur. Problème, j'aimerai bien avoir une liste complète des erreurs du fichier, et pas uniquement la première rencontré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure CheckValidationError(ValidationError : IXMLDOMParseError); begin if ValidationError.ErrorCode <> 0 then raise EXMLDOMValidationError.Create(ValidationError); end;
Je me suis donc dis que si je faisais une fonction récursive qui valide chaque noeud avec la fonction validateNode, ça pourrait le faire.
Malgré tout, ça fonctionne mais pas complètement. Je m'explique, il me trouve bien plusieurs erreurs si plusieurs balises XML manque, jusqu'à là OK. Mais si une de ces balises ne respecte pas l'expression régulière du fichier XSD, il ne la détecte pas. Donc du coup je suis un peu dans le brouillard, je ne vois pas trop comment faire.
Si une âme charitable a une idée ou a déjà effectué ce genre d'opérations ...
Ma fonction récursive ressemble à ça :
Merci d'avance.
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 procedure TForm4.validate(XMLDomNode : IXMLDOMNode; vXML : IXMLDOMDocument3); var I, j : Integer; XMLParseError : IXMLDOMParseError; begin if XMLDomNode = nil then Exit; if not XMLDomNode.hasChildNodes then begin XMLParseError := vXML.validateNode(XMLDomNode); intligne := intligne + 1; if ((XMLParseError.errorCode <> 0) and (XMLParseError.errorCode <> -1072897528)) then slErrrList.Add('ligne ' + '' + inttostr(intligne) + ' ' + ' ' + XMLParseError.reason + inttostr(XMLParseError.errorCode)) else slErrrList.Add('ligne ' + inttostr(intligne) + ' : ok'); end; XMLDomNode := XMLDomNode.FirstChild; while XMLDomNode <> Nil do begin validate(XMLDomNode, vXML); XMLDomNode := XMLDomNode.NextSibling; end; end;
Partager