2014-11-14 81 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

謝謝,這些問題使它工作。我沒有意識到,我仍然有作爲一個對象的價值。 –