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);
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;
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é.
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 :

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;
Merci d'avance.