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 :

XML An Invalid character was found in text content


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut XML An Invalid character was found in text content
    Bonjour,

    Suite à mon premier sujet : http://www.developpez.net/forums/d11...mo-string-xml/


    Je n'arrive pas à sortir de cette erreur, message complet :
    An Invalid character was found in text content
    Ligne :2
    <docs><data><doc tlien="


    Si je pars de cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         StringXml.Add('<?xml version="1.0" standalone="yes"?>');
         StringXml.Add('<docs><data/></docs>');
    Je n'ai aucun problème pour ajouter des datas que je réalise comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            With XmlDoc1.DocumentElement.ChildNodes['data'].AddChild('doc') do
            begin
              Attributes['tlien']         := '0';
              Attributes['unc']           := IncludeTrailingPathDelimiter(CheminDocuments)
                    +IncludeTrailingPathDelimiter(NomDuDossier)
                    +ExtractFileName(cheminFile.Strings[i]);
              Attributes['enclair']       := ExtractFileName(IncludeTrailingPathDelimiter(CheminDocuments)
                    +IncludeTrailingPathDelimiter(NomDuDossier)
                    +ExtractFileName(cheminFile.Strings[i]));
              Attributes['datecreation']     := FormatDateTime('dd/mm/yyyy hh:nn:ss',DateCreation);
            end;
    Par contre une fois avoir ajouté des data je tombe systématiquement sur cette erreur lorsque je rend active mon XMLDoc1.

    Pour faire plus claire voici ce que je test au début de mes opérations :

    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
      StringXml := TStringList.Create;
      Try
       if SMDBGrid1.DataSource.DataSet['Docs'] = '' then
       begin
         StringXml.Add('<?xml version="1.0" standalone="yes"?>');
         StringXml.Add('<docs><data/></doc>');
       end
      else
        StringXml.Text := SMDBGrid1.DataSource.DataSet['Docs'];
     
        XMLDoc1.active := False;
        XMLDoc1.XML.Clear;
        XMLDoc1.XML.Text := StringXML.Text;
        XMLDoc1.active := True;
     
      Finally
        if Assigned(StringXml) then FreeAndNil(StringXml);
      End;
    Donc si SMDBGrid1.DataSource.DataSet['Docs']; est vide pas de problème, je rempli moi même le StringXml (TStringList) et j'alimente mon XMLDoc1, mais si elle est déjà rempli cela ne marche pas.

    Les données reçues de SMDBGrid1.DataSource.DataSet['Docs'] que je mets dans StringXML ressemble à cela :
    <?xml version="1.0" standalone="yes"?>
    <docs><data><doc tlien="0" unc="\\user\xxxx\3TGV\Nouveauté.pdf" enclair="Nouveauté.pdf" datecreation="16/10/2011 14:17:30"/></data></docs>


    Donc quand je lis ces données et que j'alimente mon XMLDoc1, je tombe sur cette erreur.

    J'ai essayé de de faire
    StringXML.SaveToFile('c:\xxx\essai.xml');
    XMLDOC1.LoadFromFile('c:\xxx\essai.xml');
    etc... toujous pareil.

    Si je mets un showmessage sur StringXML.Text juste avant XMLDoc1.active := False; les données sont bien là (comme décrite si dessus).

    Mais chose étrange si j'ouvre le fichier essai.xml avec le navigateur c'est vide rien ne s'affiche, mais si j'ouvre avec le bloc note j'ai bien mon xml ???

    PS : SMDBGrid1.DataSource.DataSet['Docs']; est de type Memo

    je vous remercie pour votre aide à comprendre mon erreur.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Il y a une petite chose qui me gène dans ton extrait de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if SMDBGrid1.DataSource.DataSet['Docs'] = '' then
      begin
        StringXml.Add('<?xml version="1.0" standalone="yes"?>');
        StringXml.Add('<ds><data/></doc>'); //   <===  ???
        // j'écrirais plutôt...
        StringXml.Add('<docs><data/></docs>');
      end
    Tu dis : SMDBGrid1.DataSource.DataSet['Docs'] est de type Memo.
    IL contient donc déjà un XML ? comment c'est alimenté initialement ?

    Le problème ne viendrait-il pas de l'encodage de divers caractères spéciaux comme \ et / ?
    --
    Philippe.
    Philippe.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut PH. B.,

    Je viens de passé 1h dessus et je viens juste de trouver d'où cela viens.

    Si on regarde ma première ligne j'ai
    StringXml.Add('<?xml version="1.0" standalone="yes"?>');

    et quand je réalise pour la première fois l'opération je n'ai donc pas de problème car il n'y a aucune valeur à lire.

    Après une centaine de lecture d'erreur diverse, je me suis penché sur l'encoding.

    Lorsque le XML est mémorisé il ressemble donc à cela et je me prends une erreur :
    <?xml version="1.0" standalone="yes"?>
    <docs><data><doc tlien="0" unc="\\user\xxxx\3TGV\Nouveauté.pdf" enclair="Nouveauté.pdf" datecreation="16/10/2011 14:17:30"/></data></docs>


    Mais si je remplace la première entièrement par cela
    <?xml version="1.0" encoding="iso-8859-1"?>

    Je n'ai plus d'erreur !!!.

    Le problème est que la valeur qui m'ai donné est sans l'encoding et même si j'ajoute une ligne dans mon programme du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLDoc1.encoding = "iso-8859-1";
    Puisque je ne l'ai pas dont mon champ mémo cela ne marche pas, la première doit apparement obligatoirement comporter l'inscription de l'encoding !!!

    Si je suis obligé d'ajouter l'encoding, tanpis je le mettre pour l'ouvertrure et je l'enlèverai avant d'enregistrer mon champ mémo.

    Donc concretement j'ai fais cela :

    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
      StringXml := TStringList.Create;
     Try
       if SMDBGrid1.DataSource.DataSet['Documents'] = '' then
       begin
         StringXml.Add('<?xml version="1.0" standalone="yes"?>');
         StringXml.Add('<docs><data/></docs>');
       end
      else
        StringXml.Text := SMDBGrid1.DataSource.DataSet['Documents'];
     
      StringXml.Strings[0] := '<?xml version="1.0" encoding="iso-8859-1"?>';
     
      XMLDoc1.active := False;
      XMLDoc1.XML.Clear;
      XMLDoc1.XML.Text := StringXML.Text;
      XMLDoc1.active := True;
     Finally
      if Assigned(StringXml) then FreeAndNil(StringXml);
     End
    Et lorsque je mémorise dans mon champs je fais l'inverse...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLDoc1.XML.Strings[0] := '<?xml version="1.0" standalone="yes"?>';
    Merci pour ton idée PH.

    PH B. pour te répondre
    La petite erreur est juste manuelle ici...

    IL contient donc déjà un XML ? comment c'est alimenté initialement ? oui et non il pouvait soit être vide soit avoir déjà une valeur en XML.

    Le problème ne viendrait-il pas de l'encodage de divers caractères spéciaux comme \ et / ? à priori l'xml accepte tout du moment que tu as parsé avec des guillemets.


    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Si l'encodage XML n'est pas spécifié, l'unicode est utilisé. Si tu utilises une version inférieur à D2009, il y aura un problème.

    Au niveau du test en passant par un fichier, le TStringList sauve par défaut en ansi (y compris sous D2009 et plus). Il faut donc forcer l'unicode à l'écriture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringXML.SaveToFile('c:\xxx\essai.xml', TEncoding.Unicode);
    et là, plus de soucis dans IE

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Andnotor,

    J'aurais encore appris un truc... mdr

    Mais le problème est que je reçois l'info depuis un champs mémo comme ceci :
    <?xml version="1.0" standalone="yes"?>
    <docs><data><doc tlien="0" unc="\\user\xxx\3TGV\Nouveautés.pdf" enclair="Nouveautés.pdf" datecreation="06/03/2011 10:57:59"/></data></docs>


    donc je ne fais pas un loadfromfile ou même je ne la sauvegarde pas dans un fichier via savetofile, une fois l'ajoute fais dans le XMLDoc je l'enregistre dans le champs mémo de ma base.

    A moins qu'on puisse indiqué quelquechose d'encoding entre le moment où je lis le champs mémo et que j'active le XML, cela m'éviterai la bidouilledu Strings[0].

    Merci.

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

Discussions similaires

  1. Error ! Text line contains an invalid character.
    Par hakou08 dans le forum Erreurs - Avertissements
    Réponses: 3
    Dernier message: 02/08/2012, 07h45
  2. problème en lateX ! Text line contains an invalid character.
    Par Isylle dans le forum Erreurs - Avertissements
    Réponses: 1
    Dernier message: 20/06/2011, 06h19
  3. Réponses: 0
    Dernier message: 06/09/2010, 14h32
  4. Réponses: 6
    Dernier message: 05/01/2010, 21h42
  5. Erreur : Text line contains an invalid character
    Par Galaad45 dans le forum Mathématiques - Sciences
    Réponses: 4
    Dernier message: 04/05/2007, 15h52

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