我最近开始学习C#,但是我遇到了使用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>
更改特定元素中值的最简单方法是什么?
假设我要更改特定存储游戏的余额。
我想通过 IdNumber 访问该存档游戏(这些数字是唯一的)
然后我想更改余额的值(例如更改为50),然后将这些更改保存到我的文档中。
答案 0 :(得分:42)
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);
答案 1 :(得分:20)
我认为最简洁的方法是使用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,你就不会真的想回到手动枚举节点。
编辑:查询意味着什么:
//savegame/IdNumber[text()='2']/../balance"
| | | ^ balance element ...
| | ^ ... of parent ...
| ^ ... of IdNumber element with inner value '2' ...
^ ... of any savegame element in the doc
您可以找到XPath帮助here和the updated link here。
答案 2 :(得分:4)
这是一个简单的方法:
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”来实现它
答案 3 :(得分: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");
}