38

XML.Linq我最近开始学习 C#,但在使用存储数据时遇到了问题。我希望这个问题是可以理解的,因为我还不熟悉所有正确的术语,而且英语不是我的第一语言。

我阅读了很多问题/谷歌搜索,但我自己无法弄清楚。

我想更新一个现有的 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),然后将这些更改保存到我的文档中。

4

4 回答 4

48

随之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);
于 2013-08-29T11:05:57.243 回答
22

我认为最紧凑的方法是使用 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 帮助,并在此处找到更新的链接

于 2013-08-29T11:07:38.763 回答
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");

   }
于 2013-08-29T11:11:30.730 回答
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”来做到这一点

于 2013-08-29T10:47:10.520 回答