最近、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>
特定の要素の値を変更する最も簡単な方法は何ですか?
特定のsavegameのbalanceを変更したいとします。
IdNumberでセーブゲームにアクセスしたい(これらの番号は一意です)
次に、balance(たとえば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ヘルプ こちら および こちらの更新されたリンク をご覧ください。
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");
}
これを行う簡単な方法を次に示します。
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」をチェックすることでそれを行います