Подтвердить что ты не робот

Редактировать определенный элемент в XDocument

Недавно я начал изучать С#, и у меня возникла проблема с использованием XML.Linq для хранения данных. Надеюсь, этот вопрос понятен, поскольку я еще не знаком со всеми правильными условиями, и поскольку английский не является моим первым языком.

Я прочитал много Вопросов /googled, но я не могу понять это сам.

Я хочу обновить существующий файл XDocument, который выглядит так:

<Data>
  <IDCounter>2</IDCounter>
  <Highscores>
     .......
  </Highscores>
  <savegames>
    <savegame>
       <IdNumber>1</IdNumber>
       <salutation>Mr</salutation>
       <prename>Prename1</prename>
       <surname>Surname1</surname>
       <maximumbalance>100</maximumbalance>
       <balance>100</balance>
    </savegame>
    <savegame>
       <IdNumber>2</IdNumber>
       <salutation>Mr</salutation>
       <prename>Prename2</prename>
       <surname>Surname2</surname>
       <maximumbalance>100</maximumbalance>
       <balance>100</balance>
     </savegame>
   </savegames>
</Data> 

Каков самый простой способ изменить значение в определенном элементе?

Скажем, я хочу изменить баланс для определенной savegame.

Я хочу получить доступ к savegame с помощью IdNumber (эти числа уникальны)

Затем я хочу изменить значение баланса (например, до 50), а затем сохранить эти изменения в моем документе.

4b9b3361

Ответ 1

С using System.Xml.Linq; он становится

 var doc = XElement.Load(fileName);
 var saveGame = doc
      .Element("savegames")
      .Elements("savegame")
      .Where(e => e.Element("IdNumber").Value == "2")
      .Single();

 saveGame.Element("balance").Value = "50";

 doc.Save(fileName);

Ответ 2

Я думаю, что самый компактный способ сделать это с помощью XDocument (System.Xml.Linq) и расширения XPath (System.Xml.XPath):

var xdoc = XDocument.Load(file);
xdoc.XPathSelectElement("//savegame/IdNumber[text()='2']/../balance").Value = "50";
xdoc.Save(file);

После изучения XPath вы никогда не захотите вернуться к перечислению узлов вручную.

EDIT: что означает запрос:

//savegame/IdNumber[text()='2']/../balance"
  |        |                    |  ^ balance element ...
  |        |                    ^ ... of parent ...
  |        ^ ... of IdNumber element with inner value '2' ...
  ^ ... of any savegame element in the doc

Вы можете найти помощь XPath здесь и обновленную ссылку здесь.

Ответ 3

здесь простой способ сделать это:

     XmlDocument doc = new XmlDocument();
     doc.Load(@"d:\tmp.xml");
     XmlNode node = doc["Data"]["savegames"];

     foreach (XmlNode childNode in node.ChildNodes)
     {
        if (childNode["IdNumber"].InnerText.Equals("1"))
        {
           childNode["balance"].InnerText = "88";
        }

     }
     doc.Save(@"d:\tmp.xml");

этот код изменяет только баланс id "1"

он делает это, просматривая дочерние элементы "savegames" и проверяя для каждого элемента "IdNumber"

Ответ 4

   UpdateGameAttr(id ,  bal);

   private void UpdateGameAttr(int id, int bal)
   {
       XDocument gmaes = XDocument.Load(@"D:\xxx\xxx\Game.xml");            

       XElement upd = (from games in games.Descendants("savegame")
                      where games.Element("IdNumber").Value == id.ToString()
                      select games).Single();
       upd.Element("balance").Value = bal.ToString();
       gmaes.Save(@"D:\xxxx\xxx\Game.xml");

   }