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

Composants VCL Delphi Discussion :

Valider un fichier XML avec un fichier XSD


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 28
    Par défaut Valider un fichier XML avec un fichier XSD
    Bonjour, j'essaye de valider un fichier xml avec un fichier xsd.
    J'ai regardé la FAQ : http://delphi.developpez.com/faq/?pa...iderxmlavecxsd
    J'ai importé la bibliothèque de type msxml6.dll, ==> j'ai bien le fichier MSXML2_TLB qui est créé,
    je l'ai installé dans un package, compilé et installé.
    Une série de nouveaux composants ont été installé dans ma palette.

    Ensuite j'ai créer l'unité qui correspond à la FAQ "UXMLvalidation".
    Et pour finir je fais appel, à la procédure "ValidateXMLFileName" en passant mon fichier xml et mon fichier xsd.
    Et là, j'ai le message suivant : Classe non enregistrée, ClassID : {88D969C0-F192-11D4-A65F-0040963251E5}

    Le GUID correspond à l'objet CLASS_DOMDocument40.

    J'ai oublié quelque chose mais quoi ?

    Je travaille avec Windows Vista et Delphi 2007

    Qui peut m'aider, merci !

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 115
    Par défaut
    En fait tu ne dois pas utiliser la bonne version d'ActiveX ...
    Cherche ce ClassID dans les Wrappers ...
    vérifie avec RegSvr32
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Citation Envoyé par Yvan_F1 Voir le message
    Et là, j'ai le message suivant : Classe non enregistrée, ClassID : {88D969C0-F192-11D4-A65F-0040963251E5}

    Le GUID correspond à l'objet CLASS_DOMDocument40.

    J'ai oublié quelque chose mais quoi ?
    Les parseurs Xml de microsoft ne sont pas tous cumulatifs.
    Le fait d'installer MSXML6 ne te dispense pas d'installer MSXML4 !

    Pour résoudre ton problème, le plus simple serait d'utiliser un CLASS_DOMDocument60 au lieu de CLASS_DOMDocument40.
    Il a toutes les chances d'être compatible avec le 4.0 (mais c'est encore à vérifier, c'est d'ailleurs la raison pour laquelle les parseurs ne sont pas cumulatifs...).

  4. #4
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 28
    Par défaut C'est tout bon...


    Merci pour vos réponses, j'utilise la version 60 des composants et ça marche !
    (Disons que ça n'affiche plus de message d'erreur... Il va faloir vérifier le fonctionnement maintenant... )
    J'ai aussi du enregistrer la DLL avec RegServ32.

    Merci !

  5. #5
    Expert confirmé

    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 : 58
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    En fait on peut aussi le faire sans importer la bibliothèque de type et créer l'objet com par son nom.

    Voici un extrait du code me servant à la validation 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
    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
    procedure TFenGeneration.TesteXML(XSD,Balise:String;AvecOK:Boolean);
    Var S:String;
        T:TStrings;
        i:Integer;
        XMLDoc:OleVariant;
        Ver:Int64;
        VerMSXML:String;
    begin
      errLigne:=0;
      Ver := FenGeneration.GetMSXMLVersionInteger(False);
     
      If FileExists(OptKit+'xsd/article.xsd') And optXSD Then
      Begin
        If Ver<MsxmlMini Then
        Begin
          AffErreur('MSXML4.0 ou supérieur n''est pas installé, la validation XSD ne sera pas effectuée.'#13+
                    'Allez dans les options de l''éditeur pour obtenir le lien de téléchargement de MSXML4.0 SP2 sur le site de Microsoft.');
          XSD:='';
        End;
      End;
     
      // 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
        if Ver>=MSXML6 then
          VerMSXML:='6'
        Else if Ver>=MSXML5 then
          VerMSXML:='5'
        Else
          VerMSXML:='4';
     
        xmlDoc := CreateOleObject('Msxml2.DOMDocument.'+VerMSXML+'.0');
        Try
          xmlDoc.async := False;
          xmlDoc.validateOnParse := True;
          xmlDoc.resolveExternals := True;
          xmlDoc.load(OptKit+'xsd/temp.xml');
          If xmlDoc.parseError.errorCode=0 Then
          Begin
            if AvecOK then
              ShowMessage('Document validé avec succès par le XSD avec MSXML'+VerMSXML+'.');
          End Else
          Begin
            FenErreurGeneration.MessageMemo('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'MSSXML4 doit être installé pour que le test du XSD fonctionne'#13+E.Message);
        End;
      End;
    end;
    VerMSXML est mis à jour en début de programme avec une fonction toute simple :
    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
    function TFenGeneration.GetMSXMLVersionInteger(force:Boolean): Int64;
      Function test(Const Objet:String):Boolean;
      Var
        XMLDoc:OleVariant;
      Begin
        Try
          xmlDoc := CreateOleObject(Objet);
          xmlDoc := Unassigned;
          Result := True;
        Except
          Result := False;
        End;
      End;
    begin
      if (VersionMSXML=0) Or Force then
      Try
        if Test('Msxml2.DOMDocument.6.0') then
          VersionMSXML := MSXML6
        Else if Test('Msxml2.DOMDocument.5.0') then
          VersionMSXML := MSXML5
        Else if Test('Msxml2.DOMDocument.4.0') then
          VersionMSXML := MSXML4
        Else
          VersionMSXML := 0;
      Except
        VersionMSXML := 0;
      End;
      Result := VersionMSXML;
    end;
    A noter que MSXML6 est installé par défaut avec IE7 et IE8. Donc il a de grandes chances d'être présent.

    Certains schémas XSD ne passent plus avec MSXML6 alors qu'ils passent avec MSXML4.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

Discussions similaires

  1. Validation d'un fichier xml avec un fichier xsd présent en ressource
    Par lavoyech dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 20/12/2013, 10h49
  2. Réponses: 0
    Dernier message: 15/06/2012, 17h55
  3. Réponses: 3
    Dernier message: 24/07/2009, 14h04
  4. Diviser un fichier XML en plusieurs fichiers XML avec XSLT
    Par bobkorn dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/04/2008, 12h13
  5. [Xml/Xsd]valider son fichier Xml avec un schéma xsd
    Par ePoX dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/02/2006, 22h30

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