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

Windows Forms Discussion :

[C#] - Moulinette de traitement de fichiers XML


Sujet :

Windows Forms

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut [C#] - Moulinette de traitement de fichiers XML
    Bonjour,

    Voilà quelques temps que je bricole une moulinette pour traiter plusieurs fichiers en XML. Ayant de très faibles bases en C#, j'ai un peu de mal à retrouver ce dont j'aurai besoin et galère à trouver ça dans google (problème de termes, différences de traitement, etc.). Je m'en remet donc aux gourous qui passeraient par là :o

    Voici où j'en suis au niveau du traitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                DataSet dataSetFichier = new DataSet();
     
                dataSetFichier.ReadXml(txtFichier.Text);
                foreach (DataRow row in dataSetFichier.Tables[0].Rows)
                {
                         //Traitement du fichier Xml
                         //La ligne qui suit est bien sûr fausse :/
                    if (row["D_CESSATION"] && Convert.ToString(row["D_CESSATION"]) == null) listBox.Items.Add("Test");
                }
    Soit pas très loin :/

    Mon problème actuellement: je dois vérifier l'existence d'un champ et si il est présent mais null, je dois alors le supprimer. Tester qu'il est null, pas de problème, mais je n'arrive à tester qu'il soit bien présent (ou absent le cas échéant). Ca doit être tout con, mais pas moyen de trouver :/

    Si vous avez besoin de plus de précisions, n'hésitez pas.
    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Essaye cela

    DataSet dataSetFichier = new DataSet();

    dataSetFichier.ReadXml(txtFichier.Text);
    foreach (DataRow row in dataSetFichier.Tables[0].Rows)
    {
    //Traitement du fichier Xml
    //La ligne qui suit est bien sûr fausse :/
    if (row["D_CESSATION"] != null) {
    if(row["D_CESSATION"].isNull("D_CESSATION") == true) {
    listBox.Items.Add("Test");
    }
    }
    }

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse mais
    'object' does not contain a definition for 'isNull'

  4. #4
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    si tu veux tester que le champ n'est ni null ni "vide", tu peux peut-être tester sa valeur transformée en string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DataSet dataSetFichier = new DataSet();
    dataSetFichier.ReadXml(txtFichier.Text);
    foreach (DataRow row in dataSetFichier.Tables[0].Rows)
    {
       if (row["D_CESSATION"] != null && row["D_CESSATION"].ToString().Trim().Length > 0) 
          listBox.Items.Add("Test");
    }

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Ce dernier test ne me séléctionne rien et si je me limite à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row["D_CESSATION"] != null
    , toutes mes lignes sont séléctionnées.

    Mon xml de test ne possède que deux lignes avec ces champs.
    <D_CESSATION></D_CESSATION>
    et
    <D_CESSATION> </D_CESSATION>
    Le but étant de supprimer ces champs si ils sont de ce type, j'essaie déjà de pouvoir les sélectionner...

  6. #6
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Ben si le test te renvoi rien, c'est bon alors, vu que tu veux pas les champ null et vide

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Non...

    Je dois vérifier que certains champs spécifiques ne soit pas null si ils sont présents. Si c'est le cas, je devrais alors les supprimer. Mais pour le moment, je n'arrive pas à les séléctionner.

    Je sais pas si je suis bien explicite là :/

    Grosso modo, j'ai un xml de base de type
    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
    <EntrepriseRM>
    	<NUM_GESTION_RM>*****</NUM_GESTION_RM>
    	<MVT>C</MVT>
    	<SIREN>*****</SIREN>
    	<CODE_FORME_JURIDIQUE>1100</CODE_FORME_JURIDIQUE>
    	<TYPE>P</TYPE>
    	<ETAT>1</ETAT>
    	<SITUATION>1</SITUATION>
    	<DENOMINATION></DENOMINATION>
    	<NOM_COMMERCIAL>***** *****</NOM_COMMERCIAL>
    	<SIGLE></SIGLE>
    	<EFFECTIF>8</EFFECTIF>
    	<ACTIVITES_PRINCIPALES>BOULANGERIE PATISSERIE</ACTIVITES_PRINCIPALES>
    	<APE>***</APE>
    	<APRM>***</APRM>
    	<D_DEBUT_ACTIVITE>2012-01-01</D_DEBUT_ACTIVITE>
    	<D_IMMATRICULATION>2012-01-01</D_IMMATRICULATION>
    	<D_MAJ_SI>2013-02-14T11:00:00</D_MAJ_SI>
    </EntrepriseRM>
    Je dois effectuer un traitement pour pouvoir l'intégrer dans une base de données (sur laquelle je n'ai pas la main et dont certain champs, si ils sont optionnels, font planter l'import si ils sont vides... passons)

    Cet enregistrement est bon, c'est ce que je devrais avoir dans "l'idéal". Mais, pour certains enregistrements, j'ai des champs en plus (D_CESSATION entre autres) qui, si ils sont présents ne doivent pas être vide. Je cherche donc à les séléctionner et à les supprimer.

  8. #8
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    ben du coup c'est le truc contraire :

    DataSet dataSetFichier = new DataSet();
    dataSetFichier.ReadXml(txtFichier.Text);
    foreach (DataRow row in dataSetFichier.Tables[0].Rows)
    {
    if (row["D_CESSATION"] != null && row["D_CESSATION"].ToString().Trim().Length == 0)
    // Si D_Cessation existe et que sa longueur est de 0

    }

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    J'avais testé cela... je viens de le rester dans le doute (vu que logiquement c'est ce que je demande) mais je me retrouve avec tous les enregistrements (et donc même ceux qui ne possèdent pas le champ D_CESSATION :/

    Je vois vraiment pas où ça déconne :o

  10. #10
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    OK je penses que c'est parceque tu lis ton XML avec un DataSet.
    Or le DataSet agit comme une BDD, c'est a dire que tu peux pas avoir une requete qui te retourne des champs avec des fois 4 colonnes, et des fois 3.
    Donc je penses que le DataSet, au moment de lire le XML, il rajoute les champ D_CESSATION s'ils ne sont pas présents car sinon c'est pas cohérent.

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    rah... je comprend mieux :/
    Donc, si je faisait un export xml du dataset, je me retrouverais avec une structure complète de tous les champs présent.

    Bon, je peut faire comment pour traiter directement ce xml. Passer par un traitement en texte pur et dur ou bien il existe une solution plus souple ?

  12. #12
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    XmlDocument

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    C'est ce que je suis en train de voir...
    Ca fonctionne pas trop mal mais j'arrive pas à supprimer le champ :/
    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
                XmlDocument doc = new XmlDocument();
                doc.Load(txtFichier.Text);
     
                XmlNodeList elemList = doc.GetElementsByTagName("EntrepriseRM");
     
                for (int i = 0; i < elemList.Count; i++)
                {
                    XmlNodeList eltList = elemList[i].ChildNodes;
                    for (int j = 0; j < eltList.Count; j++)
                    {
                        if (eltList.Item(j).Name == "D_CESSATION" && eltList.Item(j).InnerText.Trim().Length == 0)
                        {
                            eltList.Item(j).RemoveChild(eltList.Item(j));
                        }
                    }
                }
    Je dois pas bien utiliser RemoveChild :/

  14. #14
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    C# :

    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
    		XmlDocument doc = new XmlDocument();
    		doc.Load(txtFichier.Text);
     
    		XmlNodeList elemList = doc.GetElementsByTagName("EntrepriseRM");
     
    		foreach (XmlNode node in elemList)
    		{
    			foreach (XmlNode childNode in node.ChildNodes)
    			{
    				if (childNode.Name == "D_CESSATION" && childNode.InnerText.Trim().Length == 0)
    				{
    					node.RemoveChild(childNode);
    					break;
    				}
    			}
    		}

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Bon, j'étais mal parti...

    Merci beaucoup, ça fonctionne au poil là. Reste plus qu'à continuer. Je risque de repasser je pense :o

  16. #16
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    J'avais dit que je reviendrai :o

    Comment je peut faire pour supprimer <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> ?

    J'ai testé avec XmlDeclaration mais à priori il refuse qu'on supprime la déclaration, ou alors je m'y prend mal encore :/

  17. #17
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Pourquoi le supprimer ? c'est un attribut de tout document XML, non ?

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par guitoux1
    Pourquoi le supprimer ? c'est un attribut de tout document XML, non ?
    oui, je sais bien (d'où le fait qu'en passant par xmldeclaration ça fonctionne pas) mais l'application d'import des données a été codée par un tiers et j'ai pas la main dessus. Du coup, il s'attend à une structure bien définie du fichier qui ressemble un peu à n'importe quoi mais se rapprochant fortement du xml :/
    D'où la moulinette de traitement pré-import :/

  19. #19
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Je penses que dans ce cas il ne faut pas utiliser le XmlDocument, mais ouvrir ton fichier "xml" en mode texte (avec System.IO) et retirer la première ligne.

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    En fait il va falloir que je vérifie car d'après la procédure qu'on m'a fourni, il semblerait qu'il faille le laisser si il y a des accents dans le xml. Donc, c'est que l'import doit bien se passer, même si il n'y a pas d'accent, logiquement.
    Tout bien réfléchi, je comprend pas bien pourquoi je devrais le virer :/


    Pour le moment, je lâche l'affaire avec ça.
    J'essaie de modifier les éléments parents là.
    j'ai une structure du style
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <XMLFILE>
    <RECORD>...</RECORD>
    <RECORD>...</RECORD>
    ...
    </XMLFILE>
    Qui doit devenir
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <EntreprisesRM>
    <EntrepriseRM>...</EntrepriseRM>
    <EntrepriseRM>...</EntrepriseRM>
    ...
    </EntreprisesRM>
    J'ai essayé avec pas mal de trucs (vive l'autocomplétion dans VS tout de même :o) et je me retrouve avec des erreurs du type
    Error 1 Property or indexer 'System.Xml.XmlNode.Name' cannot be assigned to -- it is read only
    Edit: merci pour ton aide et tes remarques constructives en tout cas

Discussions similaires

  1. traitement de fichiers xml
    Par stever50 dans le forum C#
    Réponses: 6
    Dernier message: 16/07/2009, 12h05
  2. probleme pour traitement de fichier xml en vba, lenteurs
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 11/09/2008, 15h57
  3. [SimpleXML] Traitement de fichier XML
    Par RasDataMan dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/11/2007, 11h44
  4. [XML] Code PHP pour traitement de fichier XML
    Par gaggy dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/09/2007, 18h44
  5. traitement de fichier XML dans une Tache planifiée
    Par marivi dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 21/06/2005, 10h40

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