DotNet / 编程技术 · 2022年9月10日

xml序列化和反序列化列表时容易混淆的坑[XmlArray和XmlArrayItem]

举例有如下一个xml格式

<rss version="5.1">
    <list page="1" pagecount="3557" pagesize="20" recordcount="71140">
        <video>...</video>
        <video>...</video>
    </list>
</rss>

作为一个新手,在定义一个可以序列化和反序列化的C#数据类时,容易写成如下代码

    [Serializable]
    [XmlRoot("rss")]
    public class ETVideoRSS {
        [XmlAttribute("version")]
        public string version { get; set; }
        [XmlElement("list")]
        public ETVideoRSSList list { get; set; }
    }

   [Serializable]
    public class ETVideoRSSList {
        [XmlAttribute("page")]
        public string page { get; set; }
        [XmlAttribute("pagecount")]
        public string pagecount { get; set; }
        [XmlAttribute("pagesize")]
        public string pagesize { get; set; }
        [XmlAttribute("recordcount")]
        public string recordcount { get; set; }
        [XmlArrayItem("video")]			//新手容易出错的地方,这里是一个数组,那么就加入一个数组的元标记,或者加入XmlArray(),
        public ETVideoRSSVideo[] video { get; set; }
    }

 	[Serializable]
    public class ETVideoRSSVideo {
        ...  
    }
那么这么写以后,程序执行序列化和反序列化的时候,一般不会出现异常错误。只是发现这个video列表根本没有得到数据,只是一个空数组

正确的写法应该是

 [XmlElement("video")]
 public ETVideoRSSVideo[] video { get; set; }
或
 public List<ETVideoRSSVideo> video { get; set; }
那么这个XmlArrayItem有什么作用呢?
就是在这个video节点上面再加一层xml结点包装,故按照上面的错误写法,实际生成xml应该如下
<rss version="5.1">
    <list page="1" pagecount="3557" pagesize="20" recordcount="71140">
 <video>
        <video>...</video>
        <video>...</video>
 <video/>
    </list>
</rss>
其实XmlArray和XmlArrayItem在使用上是有区别的,一个限定父节点名称,一个限定数组节点名称,但这里如果错误使用的情况下,效果是一样的
本人虽说不是IT新手,但由于长期未使用xml,在这个问题上也浪费了2个小时来解决问题,所以希望看到文章的人,可以不用浪费时间在这个问题上!

最新电影,电视剧,尽在午夜剧场

电影电视剧午夜不寂寞