web-dev-qa-db-fra.com

C #: modifier un nœud xml

j'ai ce fichier xml:

<?xml version="1.0" encoding="utf-8"?>
<reminders>
  <reminder>
    <Title>Alarm1</Title>
    <Description>Desc1</Description>
    <Time>03/07/2012 10:11AM</Time>
    <snooze>1</snooze>
    <repeat>None</repeat>
  </reminder>
</reminders>

Et je veux modifier le texte interne de Alarm1 à une autre valeur, j'ai donc écrit ce code qui reproduit en fait le nœud entier.

        XmlDocument xml = new XmlDocument();

        xml.Load("0.xml");

        XmlNodeList elements = xml.SelectNodes("//reminders");

        foreach (XmlNode element in elements)
        {
            if (element.InnerText == "Alarm1")
            {
                XmlNode newvalue = xml.CreateElement("MODIFIED");
                element.ReplaceChild(newvalue, element);

                xml.Save("0.xml");
            }
        }

Et puis essayé un autre code:

        foreach (XmlElement element in xml.SelectNodes("//reminder"))
        {
            if (element.InnerText == "Alarm1")
            {
                XmlNode newvalue = xml.CreateElement("MODIFIED");
                element.ReplaceChild(newvalue, element);

                xml.Save("0.xml");
            }
        }

Mais cela ne fonctionne pas non plus ....

EDIT 1: [Compris un nouveau code]

        XmlDocument xml = new XmlDocument();

        xml.Load("0.xml");

        foreach (XmlElement element in xml.SelectNodes("//reminder"))
        {
            foreach (XmlElement element1 in element)
            {
                if (element.SelectSingleNode("//Title").InnerText == "Alarm1")
                {
                    XmlNode newvalue = xml.CreateElement("MODIFIED");
                    element.ReplaceChild(newvalue, element1);

                    xml.Save("0.xml");
                }
            }
        }

Mais cela a fait que l'alarme1 devient

<MODIFIED />

EDIT 2: [JE L'AI RÉSOLU: D] D'accord, voici le code que je pourrais comprendre:

        XmlDocument xml = new XmlDocument();

        xml.Load("0.xml");

        foreach (XmlElement element in xml.SelectNodes("//reminder"))
        {
            foreach (XmlElement element1 in element)
            {
                if (element.SelectSingleNode("//Title").InnerText == "Alarm1")
                {
                    MessageBox.Show(element1.InnerText);
                    XmlNode newvalue = xml.CreateElement("Title");
                    newvalue.InnerText = "MODIFIED";
                    element.ReplaceChild(newvalue, element1);

                    xml.Save("0.xml");
                }
            }
        }

J'apprécierai vraiment votre aide et merci.

14
BOSS

Essaye ça:

xml.SelectSingleNode("//reminder/Title").InnerText = "NewValue";

Votre ligne foreach parcourt simplement une liste d'éléments appelés "rappels", pas ses nœuds enfants.

Jetez un œil à ce didacticiel xpath pour plus d'informations:

http://www.w3schools.com/xpath/xpath_intro.asp

15
aaroncatlin

Si vous voulez utiliser linq avec xml (je le trouve le meilleur moyen), alors vous voudrez utiliser le System.Xml.Linq espace de noms. Les classes de cet espace de noms sont toutes préfixées avec juste X pas Xml. La fonctionnalité de cet espace de noms est plus récente, meilleure et beaucoup plus facile à manipuler avec Linq.

var xml = XDocument.Load("0.xml");
var alarm1 = xml.Descendants("reminder")
                .Single(r => r.Element("Title") == "Alarm1");

Ce code vous donnera une variable, alarm1 qui est le rappel dont le nœud de titre est "Alarm1".

À partir de là, je ne sais pas exactement ce que vous voulez modifier. Si vous voulez juste changer le titre alors ...

alarm1.Element("Title").Value = "MODIFIED";
xml.Save("0.xml");
3
Jodrell
XDocument doc = XDocument.Load("0.xml");
IEnumerable<XElement> rech =
                     from el in doc.Root.Elements("reminder")
                     where (string)el.Element("Title") == "Alarm1"
                     select el;
if (rech.Count() != 0)
{
   foreach (XElement el in rech)
   {
       el.Element("Title").SetValue("NEW TITLE");
   }
}
doc.Save("0.xml");
2
Julien
XDocument xDoc = XDocument.Load(.....);
xDoc.Descendants("Title").First().Value = "New Value";
xDoc.Save(...)
2
L.B
XmlDocument xml = new XmlDocument();
xml.Load(...);

var newTitle = "MODIFIED";
var title_node = xml.GetElementsByTagName("Title");
if(!string.IsNullOrEmpty(newTitle) && title_node.Count > 0)
{
    title_node[0].InnerText = newTitle;
}
0
Bharat