web-dev-qa-db-ja.com

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> 

特定の要素の値を変更する最も簡単な方法は何ですか?

特定のsavegamebalanceを変更したいとします。

IdNumberでセーブゲームにアクセスしたい(これらの番号は一意です)

次に、balance(たとえば50)の値を変更し、これらの変更をドキュメントに保存します。

34
Matthias Weiß

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);
42
Henk Holterman

最もコンパクトな方法は、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ヘルプ こちら および こちらの更新されたリンク をご覧ください。

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

   }
4
Suraj Singh

これを行う簡単な方法を次に示します。

     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