Problème avec l'objet XMLDoc

Résolu
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008 - 22 oct. 2004 à 10:35
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 26 oct. 2004 à 00:03
Bonjour,

j'ai un soucis avec l'objet de Delphi le XMLDoc.

j'ai inscrit la ligne suivante :
XMLFic := LoadXMLDocument(Nom_Fic);

qui me charge dans mon objet XMLFic le fichier Nom_Fic.

Tout se passe très bien sauf si mon fichier Nom_Fic contient la chaine suivante :


Dans ce cas là, je ne peux pas charger mon fichier.

Avez-vous une solution car je bloque, et je n'ai pas envie de traiter le fichier avant de le charger dans mon objet XMLDoc.

Merci d'avance

CSweety13

4 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
23 oct. 2004 à 11:30
Après vérification, il faut déclarer l'utilisation du jeu de caractères windows-1252 dans la première ligne du fichier XML :
<?xml version="1.0" encoding="windows-1252"?>

et le symbole € (Euro) s'affichera correctement.
Un retraitement du fichier XML est donc probablement nécessaire avant son utilisation. Voici une mplémentation qui fonctionne :
  XmlDocument1.LoadFromFile('test.xml');
  
  if XmlDocument1.Encoding <> 'windows-1252' then
  begin
    XmlDocument1.Encoding := 'windows-1252';
    //Remplacement du caractère unicode de l'Euro
    XmlDocument1.XML.Text := StringReplace(XmlDocument1.Xml.Text, '&#128;', '€', [rfReplaceAll, rfIgnoreCase]);
  end;
  XMLDocument1.Active := True;
  XmlDocument1.SaveToFile('Test.xml');


Références web : XML encoding
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
23 oct. 2004 à 11:36
Rectification : en postant la réponse, je viens de m'apercevoir que la chaîne Unicode de l'Euro "& # 1 2 8 ;" (supprimer les espaces) a été remplacée par le caractère € pour la chaîne à rechercher dans les paramètres transmis à la fonction StringReplace.

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 oct. 2004 à 00:03
Pourquoi passer par un exécutable externe ?
Voici une nouvelle proposition utilisant une liste de chaînes pour faire un prétraitement :
var
  BadEncoding: boolean;
  sl: TStringList;
const
  Fichier = 'test.xml';
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(Fichier);
   //supprimer les espaces ajoutés pour publier sur DelphiFr
    sl.Text := StringReplace(sl.Text, '& e u r o ;', '& # 1 2 8;', [rfReplaceAll, rfIgnoreCase]);
    sl.SaveToFile(Fichier);
  finally
    sl.Free;
  end;

  XmlDocument1.LoadFromFile(Fichier);

  BadEncoding := XmlDocument1.Encoding <> 'windows-1252';
  if BadEncoding then
  begin
    XmlDocument1.Encoding := 'windows-1252';
    //Remplacement du caractère unicode de l'Euro
   //supprimer les espaces ici aussi (voir plus haut)
    XmlDocument1.XML.Text := StringReplace(XmlDocument1.Xml.Text, '& # 1 2 8 ;', '€', [rfReplaceAll, rfIgnoreCase]);
  end;

  XMLDocument1.Active := True;

  if BadEncoding then
    XmlDocument1.SaveToFile(Fichier);


Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
3
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
25 oct. 2004 à 16:05
Salut,

Merci pour la réponse. Effectivement si je remplace tous mes ' & e u r o ;' par des ' & # 1 2 8 ;' avant le loadfromfile tout fonctionne bien, mais si j'ai des '& e u r o ;' dans mon fichier si je fais le loadfromfile ou le LoadXMLDocument, Delphi (7) me sors de mon programme, avec toujours le meme message d'erreur :(

J'ai trouvé une solution grace au programme sed.exe qui me permet de remplacer ma chaine avant de faire le LoadXMLDocument, mais je ne trouve pas cette solution tres bien, car elle m'oblige à livrer un exécutable en plus.

si toutefois vous avez une explication à mon problème je vous en remercie.

CSweety13
0
Rejoignez-nous