[英]Updating specific XML elements in C#
我正在用C#開發一個游戲,它將在XML文件中存儲多個用戶的數據。 我在弄清楚如何僅為當前播放器(例如Jack)更新XML數據時遇到了麻煩:
<?xml version="1.0" encoding="utf-8"?>
<PlayerStats>
<Name>Jack</Name>
<WinCount>15</WinCount>
<PlayCount>37</PlayCount>
<Name>John</Name>
<WinCount>12</WinCount>
<PlayCount>27</PlayCount>
</PlayerStats>
XML文件中的元素應與C#(Jack)中的字符串變量“ strPlayerName”匹配。 然后,僅應更新Jack的WinCount和PlayCount編號。
如何將元素與strPlayerName字符串變量匹配,然后僅針對此播放器更新XML文檔中的和數字? 謝謝,
正如Matthew Watson建議的那樣,一個好的解決方案是使用XML和序列化。
在您的項目中創建一個xml,並確保將“構建操作”和“始終復制”或“如果復制到輸出目錄較新”,則將其屬性設置為none。
這是xml文件的示例:
<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfPlayer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Player>
<Name>Jack</Name>
<WinCount>15</WinCount>
<PlayCount>37</PlayCount>
</Player>
<Player>
<Name>John</Name>
<WinCount>12</WinCount>
<PlayCount>27</PlayCount>
</Player>
</ArrayOfPlayer>
現在,我們將使用此XML將其反序列化為播放器列表。 我在下面有一個用於序列化的幫助程序類。 您將讀取XML文件的內容,並將其傳遞給Deserialize方法,如圖所示。 當您想要保存播放器列表時,將該列表傳遞給Serializer並保存回您的文件。
序列化器幫助程序類:
public static class Serializer
{
public static string SerializeObject(object objectToSerialize)
{
XmlSerializer x = new XmlSerializer(objectToSerialize.GetType());
StringWriter writer = new StringWriter();
x.Serialize(writer, objectToSerialize);
return writer.ToString();
}
public static T DeserializeObject<T>(string serializedObject)
{
XmlSerializer xs = new XmlSerializer(typeof(T));
StringReader reader = new StringReader(serializedObject);
return (T)xs.Deserialize(reader);
}
}
使用該類進行反序列化:
//Change this as needed to read your XML file.
string playersXML = File.ReadAllText(@"./Players.xml");
List<Player> players = Serializer.DeserializeObject<List<Player>>(playersXML);
使用該類來序列化並保存列表:
string newPlayersXML = Serializer.SerializeObject(players);
//Change this as needed to point to the XML location
File.WriteAllText(@"./Players.xml", newPlayersXML);
最后是Player類:
public class Player
{
public string Name { get; set; }
public int WinCount { get; set; }
public int PlayCount { get; set; }
}
您將在代碼中根據需要使用Player類和列表。
假設您的XML文件如下所示:
<PlayerStats>
<Player>
<Name>Jack</Name>
<WinCount>15</WinCount>
<PlayCount>37</PlayCount>
</Player>
<Player>
<Name>John</Name>
<WinCount>12</WinCount>
<PlayCount>27</PlayCount>
</Player>
</PlayerStats>
這是使用XmlNode
API更新John的統計信息的方法:
string name = "John";
XmlNode player = doc.SelectNodes("/PlayerStats/Player")
.OfType<XmlNode>()
.FirstOrDefault(n => n["Name"].InnerText == name);
if (player != null)
{
player["WinCount"].InnerText = "21";
player["PlayCount"].InnerText = "22";
}
或使用LINQ to XML:
var player2 = xe.Descendants("Player")
.FirstOrDefault(n => (string)n.Element("Name") == name);
if (player != null)
{
player2.Element("WinCount").SetValue(21);
player2.Element("PlayCount").SetValue(22);
}
盡管正如其他人所說,對於這樣的任務,序列化,反序列化可能是解決之道。
更改您的XML結構,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<PlayerStats>
<Player>
<Name>Jack</Name>
<WinCount>15</WinCount>
<PlayCount>37</PlayCount>
</Player>
<Player>
<Name>John</Name>
<WinCount>12</WinCount>
<PlayCount>27</PlayCount>
</Player>
</PlayerStats>
創建一些類來保存您的XML數據:
[XmlRoot("PlayerStats")]
public class PlayerStats
{
[XmlElement(ElementName = "Player")]
public List<Player> Players { get; set; }
}
public class Player
{
public string Name { get; set; }
public int WinCount { get; set; }
public int PlayCount { get; set; }
}
然后,您可以執行以下操作來讀取,更新和重寫文件。
PlayerStats stats;
using (var fileStream = new System.IO.FileStream("Sample.XML", System.IO.FileMode.Open))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(PlayerStats));
stats = (PlayerStats)xmlSerializer.Deserialize(fileStream);
}
var player = stats.Players.Where(p => p.Name == "Jack").FirstOrDefault();
if (player != null)
{
// Update the record
player.WinCount = player.WinCount + 1;
player.PlayCount = player.PlayCount + 1;
// Save back to file
using (var fileStream = new System.IO.FileStream("Sample.XML", System.IO.FileMode.Create))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(PlayerStats));
xmlSerializer.Serialize(fileStream, stats);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.