Un fichier XML à partir de 2

angrodmadje Messages postés 17 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 27 juillet 2009 - 25 janv. 2009 à 22:51
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 - 29 janv. 2009 à 18:26
Bonsoir
Voilà mon problème, j'ai 2 fichiers XML, et je voudrais en obtenir qu'un seul,
<devises xml:lang="fr" xmlns:dt="urn:schemas-microsoft-com:datatypes">
   <devise>
    <cod_pay>US</cod_pay>
    <lib_pay>ETATS UNIS D'AMERIQUE</lib_pay>
    <lib_dev>DOLLAR</lib_dev>
    <cod_dev>USD</cod_dev>
   </devise>
</devise>
 
et

<CSVRoot>
  <CSVTable>
    <Libelle_pays>EMIR.A.U</Libelle_pays>
    <Date_validite>01/01/2009</Date_validite>
    <cours>4.74778</cours>
    <code_monnaie>AED</code_monnaie>
    <commentaire xml:space="preserve"> </commentaire>
  </CSVTable>
</CSVRoot>

j'aimerai avoir
<devises>
 <devise>
    <cod_pay>US</cod_pay>
    <lib_pay>ETATS UNIS D'AMERIQUE</lib_pay>
    <lib_dev>DOLLAR</lib_dev>
    <cod_dev>USD</cod_dev>
    <dat_val>01/01/2009</dat_val>
    <cours>1.4005</cours>
    <commentaire>commentaire s'il y en a un, sinon vide</commentaire>
  </devise>
  <devise>
    /*
    */
  </devise>
</devises>

je pensais passer par des dataset, mais je ne vois pas comment faire la jonction entre les deux, il faudrait qu'ils soient fusionnés grace aux colonnes cod_dev et code_monnaie

merci d'avance

6 réponses

LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 5
26 janv. 2009 à 11:32
Tu peux créer un fichier XML avec une des classes qui existe en C# et qui fait ça. Ensuite ce que tu mets dedans ça serait en fonction des noeuds de tes différents ELEMENTS de tes deux fichiers. Avec des boucles de lecture sur les lignes de tes fichiers.

La connaissance est la plus grande des richesses.
0
angrodmadje Messages postés 17 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 27 juillet 2009
26 janv. 2009 à 11:56
ouep j'ai essayé ça, lire les fichiers, et écrire d'un un nouveau, j'avais donc commencé à travailler avec un seul en lecture, ce qui donne ceci

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace scissionXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlReader xtrDevise = XmlReader.Create(@"c:\test\devise.xml");
            XmlTextWriter xtwTpri = new XmlTextWriter(@"c:\test\tpri.xml", Encoding.UTF8);
            string sIndent = string.Empty;
            string sElem = string.Empty;
            xtwTpri.Formatting = Formatting.Indented;
            xtwTpri.WriteStartDocument(true);
            xtwTpri.WriteStartElement("liste_pri xml:lang="fr" xmlns:dt="urn:schemas-microsoft-com:datatypes" annee="2008" mois="10"");
            while (xtrDevise.Read())
            {

                if (xtrDevise.NodeType == XmlNodeType.Element)
                {
                    sElem = xtrDevise.Name;
                    sIndent = string.Empty;
                    for (int i= 0; i<xtrDevise.Depth;i++) sIndent += "   ";
                    xtrDevise.MoveToFirstAttribute();
                    Console.WriteLine("{0}{1} Attr:{2}", sIndent,sElem,xtrDevise.Value);
                    xtwTpri.WriteStartElement("devise");   
                    while (xtrDevise.MoveToNextAttribute());
                }
                else if (xtrDevise.NodeType==XmlNodeType.Text)
                    Console.WriteLine("{0}{1} Val:{2}"sElem,xtrDevise.Value);
                    xtwTpri.WriteElementString(sElem, xtrDevise.Value);

            }
            xtwTpri.WriteEndDocument();
            xtwTpri.Flush();
            xtwTpri.Close();
        }
    }
}

voilà ce que j'obtiens en partie dans mon xml
      <devise />
      <devise>
    </devise>
      <cod_pay />
      <cod_pay>US</cod_pay>
      <cod_pay />
      <cod_pay>
    </cod_pay>
      <lib_pay />
      <lib_pay>ETATS UNIS D'AMERIQUE</lib_pay>
      <lib_pay />
      <lib_pay>
    </lib_pay>
      <lib_dev />
      <lib_dev>DOLLAR</lib_dev>
      <lib_dev />
      <lib_dev>
    </lib_dev>
      <cod_dev />
      <cod_dev>USD</cod_dev>
      <cod_dev />
      <cod_dev>
   </cod_dev>
      <cod_dev />
      <cod_dev>
   </cod_dev>
      <devise />
      <devise>

là où il y a des données entre les balises c'est bon ! mais le reste non comme on peut s'en douter

merci d'avance
0
angrodmadje Messages postés 17 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 27 juillet 2009
26 janv. 2009 à 12:36
après quelques reflexions, j'ai réussi à généré un fichier XML beaucoup plus intéressant :

<devise>
  <devise>
      <cod_pay>US</cod_pay>
      <lib_pay>ETATS UNIS D'AMERIQUE</lib_pay>
      <lib_dev>DOLLAR</lib_dev>
      <cod_dev>USD</cod_dev>
      <cod_pay>JP</cod_pay>
      <lib_pay>JAPON</lib_pay>
      <lib_dev>YEN</lib_dev>
      <cod_dev>JPY</cod_dev>
      <cod_pay>DK</cod_pay>
      <lib_pay>DANEMARK</lib_pay>
      <lib_dev>COURONNE DANOISE</lib_dev>
      <cod_dev>DKK</cod_dev>
      <cod_pay>&gt;GB</cod_pay>
      <lib_pay>GRANDE BRETAGNE</lib_pay>
      <lib_dev>LIVRE STERLING</lib_dev>
      <cod_dev>GBP</cod_dev>
      /*{...
      ...}*/
    </devise>
  </devise>

avec ce code :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace scissionXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlReader xtrDevise = XmlReader.Create(@"c:\test\devises.xml");
            XmlTextWriter xtwTpri = new XmlTextWriter(@"c:\test\tpri.xml", Encoding.UTF8);
            string sIndent = string.Empty;
            string sElem = string.Empty;
            xtwTpri.Formatting = Formatting.Indented;
            xtwTpri.WriteStartDocument(true);
            xtwTpri.WriteStartElement("liste_pri xml:lang="fr" xmlns:dt="urn:schemas-microsoft-com:datatypes" annee="2008" mois="10"");
            while (xtrDevise.Read())
            {

                if (xtrDevise.NodeType == XmlNodeType.Element)
                {
                    sIndent = string.Empty;
                    for (int i= 0; i<xtrDevise.Depth;i++) sIndent += "   ";
                    sElem = xtrDevise.Name;
                    if (xtrDevise.MoveToFirstAttribute())
                        do
                        {
                            Console.WriteLine("{0}{1} Attr:{2}", sIndent, sElem, xtrDevise.Value);
                            xtwTpri.WriteStartElement("devise");
                        }

                    while (xtrDevise.MoveToNextAttribute());

                }

                else if (xtrDevise.NodeType == XmlNodeType.Text)
                {
                    Console.WriteLine("{0}{1} Val:{2}", sIndent, sElem, xtrDevise.Value);
                    xtwTpri.WriteElementString(sElem, xtrDevise.Value);
                }
            }

            xtwTpri.WriteEndElement();
            xtwTpri.WriteEndDocument();
            xtwTpri.Flush();
            xtwTpri.Close();
        }
    }
}

mais il y a toujours un problème, il faudrait que la balise <devise> se ferme et se reouvre entre chaque :
      <cod_pay>CODEPAYS</cod_pay>

      <lib_pay>LIBELLEPAYS</lib_pay>

      <lib_dev>LIBELLEPAYS</lib_dev>

      <cod_dev>CODEDEVISE</cod_dev>

voilà voilà merci d'avance et merci à [../auteur/LORDOFTHESHADOW/1480695.aspx LordOfTheShadow]d'avoir insisté pour que j'utilise les classes XML
0
angrodmadje Messages postés 17 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 27 juillet 2009
27 janv. 2009 à 23:13
bonsoir, je suis toujours coincé,
en effet je n'ai pas résolu la fusions de ces dossies, si quelqu'un sait comment s'y prendre ça m'arrangerai grandement
merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
angrodmadje Messages postés 17 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 27 juillet 2009
29 janv. 2009 à 14:52
j'ai lu le tuto XPath avec la classe XmlDocument, ça semble très pratique, mais je n'arrive pas bien à l'adapter à mes besoins
pour faire simple, je vais donc lire 2 documents XML et modifier l'un des 2 à partir de l'autre
dans l'un nous avons (structure modifiée) :
      <cod_pay>CODEPAYS</cod_pay>
      <lib_pay>LIBELLEPAYS</lib_pay>
      <lib_dev>LIBELLEPAYS</lib_dev>
      <cod_dev>CODEDEVISE</cod_dev>

et dans l'autre :
      <cod_pay>CODEPAYS</cod_pay>
      <lib_pay>LIBELLEPAYS</lib_pay>
      <lib_dev>LIBELLEPAYS</lib_dev>
      <cod_dev>CODEDEVISE</cod_dev>
      <taux dt:type="float">TAUX</taux>
      <comment>COMMENT</comment>

les données cod_pay, lib_pay et lib_dev du second fichier sont erronées, et je voudrai donc récupèré les données taux et comment (toujours du second fichier) pour les ajouter au premier, en me basant sur la donnée cod_dev, qui elle est valide dans les 2 fichiers (c'est l'ID en quelque sorte)

merci d'avance
0
LordOfTheShadow Messages postés 174 Date d'inscription vendredi 22 décembre 2000 Statut Membre Dernière intervention 9 septembre 2010 5
29 janv. 2009 à 18:26
Désolé je ne sais pas. mais à mon avis faudrais que tu essayes de relancer un message parceque souvent les gens qui repondent ne repondent qu'aux messages recents. Et tu peux egalement expliquer le contexte. Je crois comprendre à ton fichier xml que tu fais un convertisseur de devises...non?

La connaissance est la plus grande des richesses.
0