1

それぞれのオブジェクトに逆シリアル化しようとしているXMLファイルがあります。2倍になっている1つのアイテムを除いて、これらのオブジェクトのほとんどでうまく機能します。XMLの関連部分は次のとおりです。

 <Clients>
    <Client Name="My Company" SiteID="1"
 GUID="xxx-xxx-xxx-xxx">
        <Reports>
          <Report Name="First Report" Path="/Custom/FirstReport">
            <Generate>true</Generate>
          </Report>
        </Reports>
    </Client>
 </Clients>

「クライアント」はList<Client>オブジェクトです。各Clientオブジェクトには、そのList<Report>中にオブジェクトがあります。問題は、このXMLが逆シリアル化されると、List<Report>オブジェクトのカウントが2になることです。つまり、「FirstReport」Reportオブジェクトが2回存在します。なんで?これがC#です:

public class Client {
    [System.Xml.Serialization.XmlArray("Reports"), System.Xml.Serialization.XmlArrayItem(typeof(Report))]
    public List<Report> Reports;
}

public class Report {
    [System.Xml.Serialization.XmlAttribute("Name")]
    public string Name;

    public bool Generate;

    [System.Xml.Serialization.XmlAttribute("Path")]
    public string Path;
}

class Program
{
    static void Main(string[] args)
    {
        List<Client> _clients = new List<Client>();
        string xmlFile = "myxmlfile.xml";
        System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(List<Client>), new System.Xml.Serialization.XmlRootAttribute("Clients"));
        using (FileStream stream = new FileStream(xmlFile, FileMode.Open))
        {
            _clients = xmlSerializer.Deserialize(stream) as List<Client>;
        }
        foreach(Client _client in _clients)
        {
            Console.WriteLine("Count: " + _client.Reports.Count); // This write "2"
            foreach(Report _report in _client.Reports)
            {
                Console.WriteLine("Name: " + _report.Name); // Writes "First Report" twice
            }
        }
    }
}
4

2 に答える 2

2

ああ、私は今少しばかげているように感じます。Client クラスのコンストラクターは、List<Report>オブジェクトを初期化するときに、既定のレポートを追加します。そして、XML は見つかったものを追加します。したがって、それを2倍にします。::はぁ::

于 2010-04-14T18:53:06.617 に答える
0

その正確なコードと XML を使用して、_client.Reports に 1 つの項目を取得します (3.5 と 4.0 の両方を対象としています)。適切な XML を取得し、適切な Report クラスを使用していることを確認してください。たぶん、別の名前空間にあるものを参照しています。

于 2010-04-14T17:25:49.370 に答える