C# 将XML节点反序列化到从属性获取值的集合中

C# 将XML节点反序列化到从属性获取值的集合中,c#,.net,xml-serialization,xmlserializer,C#,.net,Xml Serialization,Xmlserializer,如果我有这样的xml <SiteSettings> <sortOptions> <add name="By Date" value="date" /> <add name="By Rating" value="rating" /> </sortOptions> <

如果我有这样的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; }
}

我想把它反序列化成这样一个对象

        <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; }
}
[XmlRoot(“站点设置”)]
公共类SerializableSiteSettings
{
公共列表排序选项{get;set;}
}
公共类名称值对
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlAttribute(“值”)]
公共对象值{get;set;}
}
我尝试将此添加到分类中,但没有成功

    [XmlArrayItem("actionButtons", typeof(List<NameValuePair>))]
    public List<NameValuePair> ActionButtons { get; set; }
[XmlArrayItem(“操作按钮”,类型(列表))]
公共列表操作按钮{get;set;}

使用时存在一些问题:

  • 当您有一个类似于
    公共对象值{get;set;}
    的字段时,它不知道如何反序列化该字段,也不知道其中会出现什么。您需要告诉它这些信息,但由于
    是一个字符串,这表明字段是简单的,比如字符串。所以,我将在这个答案中假设一个字符串足以保存这个信息

  • 您需要告诉
    XmlSerializer
    ,名为
    SortOptions
    的属性将使用
    SortOptions
    而不是
    SortOptions
    的名称使用属性进行序列化

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

  • 因此,以下操作将
    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; }
    }
    
    [XmlRoot(“站点设置”)]
    公共类SerializableSiteSettings
    {
    [XmlArray(“分类”)]
    [XmlArrayItem(“添加”,typeof(NameValuePair))]
    公共列表排序选项{get;set;}
    }
    公共类名称值对
    {
    [XmlAttribute(“名称”)]
    公共字符串名称{get;set;}
    [XmlAttribute(“值”)]
    公共字符串值{get;set;}
    }
    

    如果
    Value
    不是字符串,而是某种多态类型,那么您可能需要为
    NameValuePair
    实现
    IXmlSerializable
    ,大致如下:.

    public List SortOptions{get;set;}应该使用[XmlArray(“SortOptions”)]属性化。谢谢,这两个问题让它起作用了。我没有意识到我作为一个物体仍然有价值。