Renommer une balise XML

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 29 oct. 2006 à 17:45
dyca370370 Messages postés 5 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 21 mai 2007 - 5 déc. 2006 à 08:25
Bonjour,
Auriez-vous une méthode pour renommer une balise d'un XmlDocument ?

merci d'avance.
Mathmax

9 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 oct. 2006 à 21:44
Pour faire un Clone, y'a toujours les méthodes Clone et CloneNode, je ne sais pas exactement si ça peut faire ce dont tu as besoin.
Sinon, tu seras effectivement obligé d'écrire une méthode du genre RenameNode que tu as posté ci-dessus.

-Blog-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 oct. 2006 à 20:40
Salut,
Je ne pense pas que ça puisse se faire directement (je ne suis pas tout à faire sûr).
Le cas échéant, il faut supprimer le Node et en recréer un avec le bon nom.

-Blog-
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
29 oct. 2006 à 21:10
c'est aussi ce que je pensais faire : une copie du nouveau node avec un nouveau nom. J'ai écris cette méthode :

        public void RenameNode(XmlNode node, string newName)
        {
            XmlElement newNode;
            newNode = doc.CreateElement(newName);
            newNode.InnerXml = node.InnerXml;
            foreach (XmlAttribute attribute in node.Attributes)
                node.Attributes.Append(attribute);
            node.ParentNode.InsertBefore(newNode, node);
        }

penses-tu qu'elle suffise à copier dans le nouveu noeud toutes les propriétés de l'ancien ? (à part le nom)
Mathmax
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
29 oct. 2006 à 22:04
ok merci. Ca marche. Voilà le code de me méthode (j'avais fais quelques erreurs) :
       
    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);
        }

Mathmax
0

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

Posez votre question
dyca370370 Messages postés 5 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 21 mai 2007
4 déc. 2006 à 15:55
J'arrive après la bataille, mais j'utilise un bout de code ci-dessous qui me permet de modifier d'un coup tous les éléments qui ont un attribut "id" avec une fonction (nouvelId) qui me retourne un code alpha aléatoire.
Il suffit de remplacer mon xPath (.//@id) par un qui va bien.
Espérant que ça serve à qq'un...
Dyca

XmlNodeList listeId = noeudXml.SelectNodes(".//@id");
//renommage des attributs id
foreach (XmlNode n in listeId) n.Value = nouvelId(unchecked((int)DateTime.Now.Ticks));
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
4 déc. 2006 à 16:10
Merci dyca370370, mais là tu modifie la  valeur des noeuds (qui dans ton cas sont d'ailleurs des attributs) alors que je voulais modifier le nom des balises. Ma fonction là haut marche bien, par contre je doute qu'elle soit rapide...

Mathmax
0
dyca370370 Messages postés 5 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 21 mai 2007
4 déc. 2006 à 17:01
Tu as entièrement raison, mais là où je dis n.value, il faut dire n.Name.
Et ma chaine xPath doit être qqchose comme ".//TOTO" pour remplacer les balises TOTO qui sont en dessous du noeud de référence.
Bonne soirée
Dyca
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
4 déc. 2006 à 17:54
Oui sauf que la propriété Name est en lecture-seule.

Mathmax
0
dyca370370 Messages postés 5 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 21 mai 2007
5 déc. 2006 à 08:25
Oups, excuse-moi!
Le innerXml est donc la bonne solution...
Dyca
0
Rejoignez-nous