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

Langage Delphi Discussion :

Valider XML avec XSD


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut Valider XML avec XSD
    Bonjour à tous.

    J'ai beau chercher, pas moyen...
    Je souhaite simplement valider un xml à son schéma xsd.
    J'ai lu qu'avec le TXMLDocument, ce n'est pas possible.
    A priori la seule solution est de se rabattre sur MSXML 4.

    Si c'est le cas, y a-il quelqu'un qui aurait un bout de code ?

    PS: Je pense aussi que cela pourarit faire l'objet d'un QR de la FAQ Delphi...

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Code extrait des sources de l'éditeur XML :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
      If FileExists(OptKit+'xsd/article.xsd') And optXSD And (XSD<>'') Then
      Begin
        // Test de validation avec le XSD aproprié
        T:=TStringList.Create;
        Try
          S:=FenPrinc.Texte.Text;
          i:=Pos(Balise,S);
          Insert(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="'+XSD+'"',S,i+Length(Balise)-1);
          T.Text := S;
          T.SaveToFile( OptKit+'xsd/temp.xml');
        Finally
          T.Free;
        End;
        Try
          xmlDoc := CreateOleObject('Msxml2.DOMDocument.4.0');
          Try
            xmlDoc.validateOnParse := True;
            xmlDoc.async := False;
            xmlDoc.load(OptKit+'xsd/temp.xml');
            If xmlDoc.parseError.errorCode=0 Then
            Begin
              ShowMessage('Document validé avec succès par le XSD.')
            End Else
            Begin
              ShowMessage('Erreur de validation par le XSD.!'#13#10
                      +xmlDoc.parseError.reason +#13#10
                      +'Error code: '+IntToStr(xmlDoc.parseError.errorCode)+#13#10
                      +'Ligne     : '+IntToStr(xmlDoc.parseError.line     )+#13#10
                      +'Colonne   : '+IntToStr(xmlDoc.parseError.linepos  )+#13#10
                      +'Contenu   : '+xmldoc.parseError.srcText);
              errLigne := xmlDoc.parseError.line;
            End;
          Finally
            xmlDoc := Unassigned;
          End;
        Except
          On E:Exception Do
          Begin
            AffErreur('Erreur de création de l''objet Msxml2.DOMDocument.4.0'#13'MSXML4 doit être installé pour que le test du XSD fonctionne'#13+E.Message);
          End;
        End;
      End;

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Merci bien Nono40.
    Voilà, sur la base de ton code, des recherches et de tests, j'en arrive à ceci qui pourrait etre interressant de mettre quelque part (source, FAQ, je ne sais pas...)


    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    interface
     
    uses
      Classes, SysUtils, msxmldom, MSXML2_TLB, xmldom, XMLDoc, XMLIntf;
     
    { Il faut importer l'activeX MSXML DOM2 4.0 pour obtenir l'unité MSXML2_TLB.pas }
     
    type
      EXMLDOMValidationError = class(Exception)
      private
        FSrcText: DOMString;
        FURL: DOMString;
        FReason: DOMString;
        FErrorCode: Integer;
        FLine: Integer;
        FLinePos: Integer;
        FFilePos: Integer;
      public
        constructor Create(const ValidationError: IXMLDOMParseError);
        property ErrorCode: Integer read FErrorCode;
        property URL: DOMString read FURL;
        property Reason: DOMString read FReason;
        property SrcText: DOMString read FSrcText;
        property Line: Integer read FLine;
        property LinePos: Integer read FLinePos;
        property FilePos: Integer read FFilePos;
      end;
     
     
    procedure Validate(XMLFilename,  XSDFilename: TFileName; NameSpaceSchema: string); overload;
    procedure Validate(XMLDoc, XSDDoc: IXMLDOMDocument2;   NameSpaceSchema: string); overload; 
     
    procedure CheckValidationError(ValidationError: IXMLDOMParseError);
     
    function GetXMLDOMDocument2(XMLDoc: IXMLDocument): IXMLDOMDocument2;
     
    resourcestring
      RS_EXMLDOM_FILE_VALIDATION_ERROR = 'Document XML non conforme au schéma.'#13#10#13#10+
                                         'Raison:'#13#10'%s'#13#10+
                                         'Ligne: %d'#13#10+
                                         'Position: %d'#13#10+
                                         'Position dans le fichier: %d'#13#10+
                                         'URL: %s'#13#10+
                                         'XML: '#13#10'%s';
     
      RS_EXMLDOM_NOFILE_VALIDATION_ERROR = 'Document XML non conforme au schéma.'#13#10#13#10+
                                           'Raison:'#13#10'%s'#13#10;
     
    implementation
     
    { EXMLDOMValidationError }
     
    constructor EXMLDOMValidationError.Create(
      const ValidationError: IXMLDOMParseError);
    begin
      FSrcText := ValidationError.srcText;
      FURL := ValidationError.url;
      FReason := ValidationError.reason;
      FErrorCode := ValidationError.errorCode;
      FLine := ValidationError.line;
      FLinePos := ValidationError.linepos;
      FFilePos := ValidationError.filepos;
     
      if FLine>0 then
        inherited CreateResFmt(@RS_EXMLDOM_FILE_VALIDATION_ERROR, [FReason,
                                                                   FLine,
                                                                   FLinePos,
                                                                   FFilePos,
                                                                   FURL,
                                                                   FSrcText])
      else
        inherited CreateResFmt(@RS_EXMLDOM_FILE_VALIDATION_ERROR, [FReason]);
    end;
     
    function GetXMLDOMDocument2(XMLDoc: IXMLDocument): IXMLDOMDocument2;
    begin
      XMLDoc.Active := True;
      Result := ((XMLDoc.DOMDocument as IXMLDOMNodeRef).GetXMLDOMNode as IXMLDOMDocument2);
    end;
     
    procedure CheckValidationError(ValidationError: IXMLDOMParseError);
    begin
      if ValidationError.errorCode<>0 then
        raise EXMLDOMValidationError.Create(ValidationError);
    end;
     
    procedure Validate(XMLDoc, XSDDoc: IXMLDOMDocument2; 
      NameSpaceSchema: string);
    var
      vSchemaCollection: IXMLDOMSchemaCollection2;
    begin
      vSchemaCollection := CoXMLSchemaCache40.Create;
      vSchemaCollection.add(NameSpaceSchema, XSDDoc);
      XMLDoc.schemas := vSchemaCollection;
      CheckValidationError(XMLDoc.validate);
    end;
     
    procedure Validate(XMLFilename,
      XSDFilename: TFileName; NameSpaceSchema: string);
    var
      vXML,
      vSchema: IXMLDOMDocument2;
      vSchemaCollection: IXMLDOMSchemaCollection2;
    begin
      vSchema := CoDOMDocument40.Create;
      vSchema.async := False;
      vSchema.load(XSDFilename);
     
      vSchemaCollection := CoXMLSchemaCache40.Create;
      vSchemaCollection.add(NameSpaceSchema, vSchema);
     
      vXML := CoDOMDocument40.Create;
      vXML.async := False;
      vXML.validateOnParse := True;
      vXML.schemas := vSchemaCollection;
      vXML.load(XMLFilename);
     
      CheckValidationError(vXML.parseError);
    end;
     
    end.

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Ouaip, tu peux donc le proposer ici :
    http://www.developpez.net/forums/viewforum.php?f=62

  5. #5
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    comme cela fait longtemps que ce post a été punlié, y a-t-il du nouveau?

    Par exemple, je ne trouve pas le ocx de msxml 2, pour fair ela validation.

    Aussi, je crée mon fichier xml à la volée. Ce n'est pas un fichier chargé. Y a-t-il un moyen de valider cela au fur et à mesure de la construction du XML?

    Merci d'avance.

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut eponette

    Je me posais exactement la même question hier...

    Pour ma part, je ne trouve nulle part le fameux ActiveX,
    je suis donc bloqué et je parcours internet à la recherche de tuyaux...

    Je suis donc preneur moi aussi de tous les tuyaux pour valider du XML à partir d'un fichier XSD...

  7. #7
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157

  8. #8
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Re salut,

    cela va finalement fonctionné ;o)

    Mais, qu'est-ce ceci: 'NameSpaceSchema' ?

    Aussi, il me met comme message d'erreur :

    'Validate failed because the root element had no associated DTD/schema.'#$D#$A
    Qu'est-ce que cela veut dire?

    Merci

  9. #9
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Je fais un up pour voir si personne ne peut m'aider.

    Je ne sais pas ce que je dois mettre comme NameSpaceSchema

    merci d'avance

  10. #10
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Au secours, aidez moi. Je suis coincé dans ma validation à cause de cette information manquante.

    Quelqu'un peut m'aider?

  11. #11
    Membre averti

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Points : 441
    Points
    441
    Par défaut
    Essaie de mettre une chaîne vide ('').
    Si je comprend bien le truc (faudrait demander à un grand ponte du xml), le NameSpaceSchema est un chemin vers un schéma sur le Web (Du moins, c'est comme ça que je le vois, d'après les exemples...). Mais je ne le jurerais pas.

    en tout cas, quand je veux valider mes documents, je mets une chaîne vide et ça passe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Validation XML avec XSD provenant d'une BDD
    Par Yoyo17 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 29/10/2012, 09h55
  2. C# Validation XML avec XSD
    Par Spotty dans le forum C#
    Réponses: 1
    Dernier message: 11/02/2009, 16h22
  3. [WD 12] MSXML - validation xml avec xsd externe
    Par nicol9 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/07/2008, 15h08
  4. Validation XML avec un schema XSD
    Par eods dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/05/2006, 14h33
  5. [XSD][xerces] validation xml avec un xsd
    Par chand_bing dans le forum Valider
    Réponses: 2
    Dernier message: 05/02/2004, 20h21

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