Редактировать определенный элемент в 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), а затем сохранить эти изменения в моем документе.
Ответы
Ответ 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");
}