37

次のような XML ドキュメントがあります。

<scan_details>
    <object name="C:\Users\MyUser\Documents\Target1.doc">
        ...
    </object>
    <object name="C:\Users\MyUser\Documents\Target2.doc">
        ...
    </object>
    ...
</scan_details>

System.Xml.Serialization属性を使用して XML デシリアライゼーションを簡素化したいと考えています。私が抱えている問題は、ルート ノードに配列が含まれていることを指定する方法がわからないことです。

私は次のクラスを作成しようとしました:

[XmlRoot("scan_details")]
public class ScanDetails
{
    [XmlArray("object")]
    public ScanDetail[] Items { get; set; }
}

public class ScanDetail
{
    [XmlAttribute("name")]
    public string Filename { get; set; }
}

ただし、XML をScanDetailsオブジェクトに逆シリアル化すると、Items配列は残りnullます。

ルート ノードで配列をデシリアライズするにはどうすればよいですか?

4

1 に答える 1

69

[XmlElement]Items プロパティを装飾するのではなく、を使用する必要があります。[XmlArray]これは既に配列であり、要素名のみを設定する必要があります。

public class StackOverflow_12924221
{
    [XmlRoot("scan_details")]
    public class ScanDetails
    {
        [XmlElement("object")]
        public ScanDetail[] Items { get; set; }
    }

    public class ScanDetail
    {
        [XmlAttribute("name")]
        public string Filename { get; set; }
    }

    const string XML = @"<scan_details> 
                            <object name=""C:\Users\MyUser\Documents\Target1.doc""> 
                            </object> 
                            <object name=""C:\Users\MyUser\Documents\Target2.doc""> 
                            </object> 
                        </scan_details> ";

    public static void Test()
    {
        XmlSerializer xs = new XmlSerializer(typeof(ScanDetails));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML));
        var obj = xs.Deserialize(ms) as ScanDetails;
        foreach (var sd in obj.Items)
        {
            Console.WriteLine(sd.Filename);
        }
    }
}
于 2012-10-16T22:19:40.270 に答える