簡體   English   中英

編輯XDocument中的特定元素

[英]Edit specific Element in XDocument

我最近開始學習C#,並且在使用XML.Linq存儲數據時遇到問題。 我希望這個問題是可以理解的,因為我還不熟悉所有正確的術語,並且英語不是我的母語。

我讀過很多問題/用谷歌搜索,但是我自己也無法弄清楚。

我想更新現有的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),然后將這些更改保存到我的文檔中。

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);

我認為最緊湊的方法是使用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幫助,並 這里找到更新的鏈接

這是執行此操作的簡單方法:

     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”來實現

   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");

   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM