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

C# Discussion :

[C#] Ressource incorporée XML qui ne s'ouvre pas


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut [C#] Ressource incorporée XML qui ne s'ouvre pas
    Bonjour,
    Dans mon application j'ai quelques fichiers XML dans le dossier 'Resources' qui me servent de base de données. A l'installation, je les place dans un répertoire où l'application peut les trouver en cas d'appel. Je les installe sans problème avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Stream _stream = _assembly.GetManifestResourceStream(sNomComplet);
                                byte[] bytesInStream = new byte[_stream.Length];
                                try
                                {
                                    WriteFile(PathBaseXML, "XMLCatégories.xml", bytesInStream);
                                }
                                catch (Exception ex)
                                {
                                    _bNoMatches = true;
                                    _sMessageErreur = ex.Message;
                                }
    Et pour y accéder j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                string sXPathQuery = "";
                string sPathDocuments = ConnexionBaseRegistres.chercherParamètreBaseRegistres("Path Base XML");
                sPathDocuments = sPathDocuments + "XMLRenseignementsGénéraux.xml";
                sXPathQuery = "//Pays";
                XPathNodeIterator Nodes;
                try
                {
                    XPathDocument doc = new XPathDocument(sPathDocuments);
    etc...
    Mais quand j'arrive à cette dernière instruction, j'ai un message d'erreur qui me dit que "L'élément racine est manquant". Et de plus, lorsque je veux ouvrir le document dans son répertoire, le bloc-notes s'affiche mais rien n'y apparait.
    Quelqu'un aurait-il une idée de ce qui se passe ?

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    J'ai oublié de donner le code de la méthode WriteFile():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static void WriteFile(string pathXML, string filename, byte[] bytes)
            {
                string sPath = pathXML;
                if (!sPath.EndsWith(@"\")) sPath += @"\";
                sPath = sPath + filename;
                using (FileStream fs = new FileStream(sPath, FileMode.CreateNew, FileAccess.Write))
                {
                    fs.Write(bytes, 0, (int)bytes.Length);
                    fs.Close();
                }
            }
    Cela permettra peut-être de trouver une indication.

  3. #3
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Tu as peut-être un problème d'encodage dans ta méthode WriteFile....... pourquoi n'utilises-tu pas ceci pour extraire ta resource incorporée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.IO.File.WriteAllText(@"D:\XMLCatégories.xml", Properties.Resources.XMLCatégories);

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 447
    Par défaut
    Bonjour,
    Je vois bien une déclaration du tableau bytesInStream, mais aucune affectation. Le tableau est donc vide...

    Tatayo.

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Je vois bien une déclaration du tableau bytesInStream, mais aucune affectation. Le tableau est donc vide...

    Tatayo.
    L'affectation se fait dans la méthode WriteFile par le biais de son 3ème argument

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Merci pour l'attention que vous portez à mon problème.
    J'ai utilisé la méthode WriteAllText() comme me le suggérait Wallace mais maintenant j'ai un message d'erreur qui me dit: "Impossible de trouver une partie du chemin d'accès" de PathBaseXML alors qu'avec la méthode FileStream() le chemin était trouvé sans problème ... !?

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 447
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    L'affectation se fait dans la méthode WriteFile par le biais de son 3ème argument
    Pour moi c'est l'inverse: WriteFile tente de sauvegarder le contenu du tableau, et non de le remplir. Je vois bien un fs.Write, mais aucune lecture.
    Donc pour moi cette méthode enregistre un tableau vide.

    Tatayo.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Si je suis le raisonnement de tatayo je dois d'abord lire et ensuite écrire. J'ai essayé ceci mais sans résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
               using (FileStream fs = new FileStream(sPath, FileMode.CreateNew, FileAccess.ReadWrite))
               {
                    fs.Read(bytes, 0, (int)bytes.Length);
                    fs.Write(bytes, 0, (int)bytes.Length);
                    fs.Close();
                }
    Mais la taille des fichiers enregistrés est indiquée. Cela ne veut-il pas dire que le nombre d'octets est présent ?

  9. #9
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 447
    Par défaut
    Non, car là tu tentes de lire le fichier que tu veux créer.

    Si je relis bien ce code:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Stream _stream = _assembly.GetManifestResourceStream(sNomComplet);
                                byte[] bytesInStream = new byte[_stream.Length];
    Tu récupère bien la taille du flux, mais à aucun moment son contenu.
    Il faut donc remplir le tableau avec le contenu du flux.

    Tatayo.

  10. #10
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Pour moi c'est l'inverse: WriteFile tente de sauvegarder le contenu du tableau, et non de le remplir. Je vois bien un fs.Write, mais aucune lecture.
    Donc pour moi cette méthode enregistre un tableau vide.

    Tatayo.
    Effectivement en relisant tu as raison.

    @OP : File.WriteAllText doit fonctionner donc maintenant il faut voir à quoi ressemble ton chemin ?

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Oui je comprend bien le raisonnement. Effectivement, voilà pourquoi j'obtiens la taille du fichier. Mais pour ce qui est de copier le contenu je fais comment ? Un while(_stream.ReadByte()) ?

    J'ai modifié ma méthode WriteFile() dont voici le contenu:
    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
            public static void WriteFile(string pathXML, string filename, byte[] bytes)
            {
                string sPath = pathXML;
                if (!sPath.EndsWith(@"\")) sPath += @"\";
                sPath = sPath + filename;
                new Random().NextBytes(bytes);
                using (FileStream fs = new FileStream(sPath, FileMode.CreateNew))
                {
                    for (int id = 0; id < bytes.Length; id++)
                    {
                        //fs.WriteByte(bytes[id]);
                        fs.Write(bytes, 0, (int)bytes.Length);
                    }
                    fs.Seek(0, SeekOrigin.Begin);
                    for (int id = 0; id < fs.Length; id++)
                    {
                        if (bytes[id] != fs.ReadByte())
                        {
                            Console.WriteLine("Error writing data.");
                        }
                    }
                    fs.Close();
                }
            }
    Effectivement, les fichiers peuvent maintenant s'ouvrir mais ils ne me donnent pas un contenu 'XML', seulement une suite de caractères incompréhensibles que ce soit avec WriteBytes() ou avec Write().

  12. #12
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    C'est quoi cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Random().NextBytes(bytes);
    ??????

    Bon bah perso puisque tu veux le faire en parcourant le Stream je ferais comme ceci :

    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
    //Veille à ce que ton fichier de resource XML soit paramétré en resource incorporé
     using (Stream inputStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ExtractXml.Resources.XMLCatégories.xml"))
                using (Stream outputStream = System.IO.File.Create(@"D:\tttt.xml"))
     
                {
                    //On déclare et instancie un Byte Array (dimensionné à la taille de l'InputStream)
                    byte[] buff = new byte[inputStream.Length];
                    int bytesRead;
                    //On lit le flux de l'InputStream
                    while ((bytesRead = inputStream.Read(buff, 0, buff.Length)) > 0)
                    {
                        //On écrit chaque Byte lu dans l'OutputStream
                        outputStream.Write(buff, 0, bytesRead);
                    }
                }
    PS : Bien veiller à ce que ton fichier .xml dans tes resources soit paramétré en Resource incorporée

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    J'ai trouvé un exemple de méthode sur MSDN que j'ai adapté. Je ne sais pas très bien le sens de cette commande mais si je ne l'inclus pas dans le code je fichier n'affiche rien et s'il est inclus j'ai droit à tous les caractères illisibles ...

    Oui le fichier XML est bien inscrit comme Resource incorporée.

    Merci Wallace, avec ce code ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using (Stream inputStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("SWMS_2018_FAV.Resources.XMLCatégories.xml"))
    {
                using (Stream outputStream = System.IO.File.Create(PathBaseXML + "XLMCatégories.xml"))
                {
                           byte[] buff = new byte[inputStream.Length];
                           int bytesRead;
                           while ((bytesRead = inputStream.Read(buff, 0, buff.Length)) > 0)
                           {
                                   outputStream.Write(buff, 0, bytesRead);
                            }
                 }
    }
    Je n'ai jamais compris comment avec la méthode File.WriteAllText() il ne trouvait pas le chemin d'accès alors que c'est exactement le même dans toutes les possibilités. Je l'avais même écrit en "dur", mais rien n'y a fait ...?! Quoi qu'il en soit merci à vous deux pour ce sacré coup de main.

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

Discussions similaires

  1. PDF qui ne s'ouvre pas sous IE
    Par keub51 dans le forum Langage
    Réponses: 1
    Dernier message: 26/04/2007, 11h56
  2. [WD11] Fenetre qui ne s'ouvre pas
    Par hegros dans le forum WinDev
    Réponses: 29
    Dernier message: 27/03/2007, 11h33
  3. Réponses: 4
    Dernier message: 12/10/2006, 12h43
  4. [BDS 2006] Fichier d'aide qui ne s'ouvre pas
    Par doudoustephane dans le forum C++Builder
    Réponses: 5
    Dernier message: 31/08/2006, 20h07
  5. Fenetre qui ne s'ouvre pas
    Par Anduriel dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 29/06/2006, 11h23

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