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 :

Comment changer le nom d'un noeud dans un fichier xml


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut Comment changer le nom d'un noeud dans un fichier xml
    Bonjour,

    Pourriez-vous m'indiquer la méthode pour changer un nom de noeud dans un fichier xml svp.

    J'arrive à me positionner sur le bon noeud mais quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodeA.Name.Replace("item", "itema");
    Il ne modifie pas le nom de nodeA

    J'ai également essayé en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlDoc.SelectSingleNode("//Envelope/Body/calculScoreDemandeCredit/demande/listeAvance/item").InnerText = "itema";
    La ça marche, mais il me supprime tout le contenu

    Est ce que quelqu'un pourrait m'aider?

    voici un bout de mon xml

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?xml version="1.0" encoding="UTF-8" ?> 
    <Envelope>
    	<Body>
    		<validationDemandeCredit>
    			<demande>
    				<autreRevenu>0</autreRevenu> 
    				<listeAvance>
    					<item>
    					<codeBarAvance>PBST</codeBarAvance> 
    					<codeLoiAvance>D</codeLoiAvance> 
    					</item>
    				</listeAvance>
    				<listeBien>
    					<item>
    					<codePostalBien>1040</codePostalBien> 
    					<nombreBienInterface>1</nombreBienInterface> 
    					<typeBien>01</typeBien> 
    					</item>
    				</listeBien>
    				<listeClient>
    					<item>
    					<categorieSocioProfessionelleClient>22</categorieSocioProfessionelleClient> 
    					<dateDebutEmploi>1969-12-31T23:59:59Z</dateDebutEmploi> 
    					<dateNaissanceClient>1988-05-05T23:00:00Z</dateNaissanceClient> 
    					</item>
    				</listeClient>
    				<listeColateral>
    					<item>
    					<codePostalColateral>1040</codePostalColateral> 
    					<nombreColateralInterface>1</nombreColateralInterface> 
    					<referenceColateral>B1B08ZIKVD00003L</referenceColateral> 
    					</item>
    				</listeColateral>
    				<listeProject>
    					<item>
    					<coutProjet>120000</coutProjet> 
    					<nombreProjetInterface>1</nombreProjetInterface> 
    					<typeProjet>B21</typeProjet> 
    					</item>
    				</listeProject>
    				<listePassif>
    				</listePassif> 
    				<montantAcompte>0</montantAcompte> 
    				<montantDemandeCredit>120000</montantDemandeCredit> 
    			</demande>
    		</validationDemandeCredit>
    	</Body>
    </Envelope>
    j'aimerais en fait modifier item du noeud parent listAvance par itemA
    listClient par itemC
    listeBien par ItemB
    etc...

    Merci pour votre aide.

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Si je ne dis pas de bétise, xmlNode.Name retourne une String, donc ton Replace n'agit pas sur la String mais en retourne une.

    Si tu fais String s = "toto"; et s.Replace("toto","tata"); la chaîne ne changera pas. Replace renvoie le résultat.

    As tu tout simplement essayé de faire xmlNode.Name = "Toto" ?
    EDIT: Impossible car en read only.

    Une autre solution serait de recréer un node à partir du XmlDocument et ensuite de cloner les childnodes de l'un pour les ajouter au nouveau node. Ca fait un peu usine à gaz mais je connais pas de bonne solution, désolé.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    J'ai trouvé une solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void RenameNode(XmlNode node, string newName)
            {
                XmlElement newNode;
                newNode = doc.CreateElement(newName);
                newNode.InnerXml = node.InnerXml;
                foreach (XmlAttribute attribute in node.Attributes)
                {
                    XmlAttribute newAttribute = (XmlAttribute)attribute.Clone();
                    newNode.Attributes.Append(newAttribute);
                }
                node.ParentNode.ReplaceChild(newNode, node);
            }
    merci à toi

  4. #4
    Membre averti Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Points : 422
    Points
    422
    Par défaut
    J'étais justement en train de te faire ça
    C'est légèrement différent, donc je met ça quand même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            public static void Replace(XElement currentNode, string replace, string replaceBy)
            {
                foreach (var node in currentNode.Nodes().OfType<XElement>())
                {
                    if (node.Name == replace)
                        node.Name = replaceBy;
     
                    Replace(node, replace, replaceBy);
                }
            }
    A utiliser comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            static void Main(string[] args)
            {
                var xml = XDocument.Load(@"C:\\Config.xml");
     
                Replace(xml.Root, "Test", "Okay");
     
                xml.Save(@"C:\\Config2.xml");
            }

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Rebonjour,

    Je reviens sur le problème car j'ai en effet tester de le faire pour plusieurs noeud fils mais ça ne fonctionne pas. Et je ne vois pas pq.

    Voici ma fonction

    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
    private void modifXml(string p)
            {
                XmlDataDocument xmlDoc = new XmlDataDocument();
                xmlDoc.Load(p);
                XmlNode node;
                node = xmlDoc.DocumentElement;
                foreach (XmlNode node1 in node.ChildNodes)
                {
                    foreach (XmlNode node2 in node1.ChildNodes)
                    {
                        foreach (XmlNode node3 in node2.ChildNodes)
                        {
                            foreach (XmlNode node4 in node3.ChildNodes)
                            {
                                //modification des noeuds
                                switch (node4.Name)
                                {
                                    case "listeAvance":
                                        foreach (XmlNode nodeA in node4.ChildNodes)
                                        {
                                           // if (nodeA.Name == "item")
                                            //{
                                                MessageBox.Show("test");
                                                RenameNode(xmlDoc, nodeA, "itemA");
    et ma fonction RenameNode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void RenameNode(XmlDataDocument doc, XmlNode node, string newName)
            {
                XmlElement newNode;
                newNode = doc.CreateElement(newName);
                newNode.InnerXml = node.InnerXml;
                foreach (XmlAttribute attribute in node.Attributes)
                {
                    XmlAttribute newAttribute = (XmlAttribute)attribute.Clone();
                    newNode.Attributes.Append(newAttribute);
                }
                node.ParentNode.ReplaceChild(newNode, node);
            }
    Voici mon problème lorsque mon fichier Xml ressemble à ça :
    <listeAvance>
    <item>
    </item>
    <item>
    </item>
    </listeAvance>

    Après traitement il me donne
    <listeAvance>
    <itemA>
    </itemA>
    <item>
    </item>
    </listeAvance>


    En effet il ne modifie qu'un noeud.
    Quelqu'un saurait-il pourquoi?

    Merci à vous.

  6. #6
    Membre averti Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Points : 422
    Points
    422
    Par défaut
    Bonjour,

    J'avais une fonction, tu ne t'en sert pas ?

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Si si j'ai essayé ta fonction mais elle a des erreurs.
    currentNode ne contient pas de .Nodes()

    ET je ne sais pas comment lui donner le noeud sur lequel je suis positionné en paramètre lors de l'appel de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach (XmlNode node4 in node3.ChildNodes)
                            {
                                //modification des noeuds
                                switch (node4.Name)
                                {
                                    case "listeAvance":
                                        foreach (XmlNode nodeA in node4.ChildNodes)
                                        {
                                                //RenameNode(xmlDoc, nodeA, "itemA");
                                                Replace(nodeA , "item", "itemA");
                                        }
                                    break;
    nodeA ne fonctionne pas ni xmlDoc.root

    Donc je suis un peu perdu

  8. #8
    Membre averti Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Points : 422
    Points
    422
    Par défaut
    Met plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public static void Replace(XElement currentNode, string replace, string replaceBy)
            {
                foreach (var node in currentNode.Elements())
                {
                    if (node.Name == replace)
                        node.Name = replaceBy;
     
                    Replace(node, replace, replaceBy);
                }
            }

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Bonjour et encore merci pour ton aide.

    N'est pas reconnu,
    J'ai essayé de trouver System.Xml.Linq dans les références
    Je l'ai trouvé grisé (non sélectionnable)
    avec ce message d'erreur:

    System.Xml.Linq is not compatible with the specified .NET Framework version.
    You can change the .NET Framework target by clicking Properties on the Project menu and then selecting a new target in the .NET Framework dropdown box.
    Je suis en 3.5

    As-tu une autre solution à me proposer?

    MErci.


    UPDATE: Autant pour moi j'ai changé le Framework, j'étais en 2.0 maintenant en 3.5 et j'ai pu ajouter la référence System.Xml.Linq.

    Maintenant dans mon cas, que dois je mettre lors de l'appel de la fonction?

    NodeA ne fonctionnant pas?

    Merci

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Bonjour à tous,

    J'ai trouvé la solution à mon problème

    J'ai pris la 1ère fonction mais lors de l'appel, au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case "listeAvance":
                                        foreach (XmlNode nodeA in node4.ChildNodes)
                                        {
                                                RenameNode(xmlDoc, nodeA, "itemA");
                                        }
    J'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case "listeAvance":
     
                                        for (int i = 0; i < node4.ChildNodes.Count; i++)
                                        {
                                            XmlNode nodeA = node4.ChildNodes.Item(i);
                                            RenameNode(xmlDoc, nodeA, "itemA");
                                        }
    De cette façon il passe bien tout les noeuds fils en compte.

    Merci quand même à Jerede pour son aide.

    Bàv,

    Francis

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/07/2011, 13h13
  2. Récupérer le nom d'un noeud dans un fichier xml
    Par amirad dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/06/2009, 18h20
  3. Réponses: 1
    Dernier message: 13/11/2007, 16h35
  4. Comment changer l'ordre d'affichage Bibtex dans un fichier Latex
    Par kimoto dans le forum Bibliographies - Index - Glossaires
    Réponses: 3
    Dernier message: 26/01/2007, 12h07

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