【问题标题】:Using XmlSerializer with an array in the root element将 XmlSerializer 与根元素中的数组一起使用
【发布时间】:2012-10-07 02:45:35
【问题描述】:

我有一个类似于以下内容的 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

如何反序列化根节点中的数组?

【问题讨论】:

    标签: c# .net arrays xml-serialization


    【解决方案1】:

    您应该使用[XmlElement],而不是[XmlArray] 来装饰 Items 属性 - 它已经是一个数组,您只想设置元素名称。

    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);
            }
        }
    }
    

    【讨论】:

    • 啊...他们使用的术语令人困惑。我一直关注XmlArrayXmlArrayItem。谢谢!
    • 如果是数组,但不只是在根级别下,那么数组属性似乎仍然需要[XmlArray("arrayElementName")],而不是[XmlElement("arrayElementItemName")],但如果在像你的答案一样的根级别下它需要 [XmlElement("arrayElementItemName")] 你知道为什么会这样吗?就像在根级别描述内部重复元素类型,在其他地方描述数组类型。
    • 我只想花点时间感谢您。我搜索了许多问题的许多答案,这是唯一有效的方法。太不直观了,你不需要在根元素上定义数组属性,也不需要在数组元素上定义。
    • 如果元素包含的子元素都是相同类型的,或者都是从相同类型派生的,那么您可以使用 XmlElement。如果元素包含多个具有不相关类型的不同集合,那么您需要使用 XmlArray 为每个集合创建一个子元素。这是 XML 的一个细节,同一个集合中不能有不相关的类型,属性只是反映了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多