2014-11-14 55 views
2

获取值,如果我有一些这样的XML反序列化XML节点到一个集合从属性

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

我想deserialise成这样

[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; } 
+0

public List SortOptions {get;组; }应该归因于[XmlArray(“sortOptions”)]我猜。 – whoisthis

回答

2

有几个问题与您使用XmlSerializer

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

  2. 你需要告诉XmlSerializer,你的属性命名SortOptions是名为sortOptions,不SortOptions被序列化,使用XmlArray属性。

  3. 您需要告诉XmlSerializeradd是每个数组元素的名称,使用XmlArrayItem属性。

因此,下面的作品并读取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不是字符串,并且还真是有些多态类型,您可能需要实现IXmlSerializableNameValuePair,沿以下行:.NET XmlSerializer: polymorphic mapping based on attribute value

+0

谢谢,这些问题使它工作。我没有意识到,我仍然有作为一个对象的价值。 –