1

複数のユーザーのデータを XML ファイルに保存するゲームを C# で作成しています。現在のプレーヤー (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 ドキュメント内の と の数値を更新するにはどうすればよいですか? ありがとう、

4

3 に答える 3

1

Matthew Watson が推奨したように、良い解決策は XML とシリアライゼーションを使用することです。

プロジェクトで xml を作成し、そのプロパティが [ビルド アクション] に対して [なし] に設定されていること、[出力ディレクトリにコピー] に対して [常にコピー] または [新しい場合はコピー] に設定されていることを確認します。

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 メソッドに渡します。Players リストを保存する場合は、リストを 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 クラスとリストを使用します。

于 2013-05-17T20:37:19.797 に答える
0

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);
    }
}
于 2013-05-17T20:43:42.063 に答える
0

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>

XmlNodeAPIを使用して 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);
}

他の人が言ったように、このようなタスクでは、シリアル化、逆シリアル化がおそらく道です。

于 2013-05-17T20:30:20.030 に答える