将XML节点反序列化为从属性获取值的集合

时间:2014-11-14 04:02:03

标签: c# .net xml-serialization xmlserializer

如果我有像这样的xml

        <SiteSettings>              
            <sortOptions>
                <add name="By Date" value="date" />
                <add name="By Rating" value="rating" />
            </sortOptions>
        </SiteSettings>

我想将其反序列化为像这样的对象

[XmlRoot("SiteSettings")]
public class SerializableSiteSettings
{
    public List<NameValuePair> SortOptions { get; set; }
}

public class NameValuePair
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    [XmlAttribute("value")]
    public object Value { get; set; }
}

我尝试将此添加到SortOptions但它无法正常工作

    [XmlArrayItem("actionButtons", typeof(List<NameValuePair>))]
    public List<NameValuePair> ActionButtons { get; set; }

1 个答案:

答案 0 :(得分:2)

使用XmlSerializer时存在一些问题:

  1. XmlSerializer needs to know the types to expect when (de)serializing.当你有一个像public object Value { get; set; }这样的字段时,它不知道如何反序列化字段或其中的内容。你需要告诉它那些信息 - 但是因为Value是一个attribute,它表明该字段很简单,就像一个字符串。所以,我将在这个答案中假设一个字符串足以保存这些信息。

  2. 您需要告诉XmlSerializer使用{{3},使用名称SortOptions而不是sortOptions序列化名为SortOptions的媒体资源} attribute。

  3. 您需要使用XmlArray属性告诉XmlSerializer add是每个数组元素的名称。

  4. 因此,以下工作并将Value读入字符串:

    [XmlRoot("SiteSettings")]
    public class SerializableSiteSettings
    {
        [XmlArray("sortOptions")]
        [XmlArrayItem("add", typeof(NameValuePair))]
        public List<NameValuePair> SortOptions { get; set; }
    }
    
    public class NameValuePair
    {
        [XmlAttribute("name")]
        public string Name { get; set; }
        [XmlAttribute("value")]
        public string Value { get; set; }
    }
    

    如果Value不是字符串且实际上是某种多态类型,则可能需要为IXmlSerializable实施NameValuePair,如下所示:XmlArrayItem