2013-06-23 77 views
0

我想將XML文件轉換爲C#對象。我的對象是如下反序列化返回empy對象

[Serializable] 
[XmlRoot(ElementName = "Collection")] 
public class Collection 
{ 
    public Collection() 
    { 
     Artiesten = new List<Artiest>(); 
     Albums = new List<Album>(); 
     Nummers = new List<Nummer>(); 
    } 
    [XmlElement("Artiesten")] 
    public List<Artiest> Artiesten { get; set; } 
    [XmlElement("Albums")] 
    public List<Album> Albums { get; set; } 
    [XmlElement("Nummers")] 
    public List<Nummer> Nummers { get; set; } 

} 

[Serializable] 
public class Artiest 
{ 
    [XmlAttribute("artiestid")] 
    public int ArtiestId { get; set; } 
    [XmlElement(ElementName = "Naam")] 
    public String Naam { get; set; } 
    [XmlElement(ElementName = "Albums")] 
    public List<Album> Albums { get; set; } 
} 

[Serializable] 
public class Nummer 
{ 
[XmlAttribute("nummerid")] 
    public int NummerId { get; set; } 
    [XmlElement(ElementName = "titel")] 
    public String Titel { get; set; } 
    [XmlElement(ElementName = "duur")] 
    public String Duration { get; set; } 
} 

我的XML是這樣的:

<Collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Artiesten> 
    <Artiest artiestid="1"> 
     <Naam>Harry</Naam> 
     <Albums> 
     <Album albumid="1"> 
      <Titel>Album1</Titel> 
      <prijs valuta="Euro">19.99</prijs> 
      <uitgiftejaar>1999</uitgiftejaar> 
      <Nummers> 
      <Nummer nummerid="1"> 
       <titel>happy Sundays</titel> 
       <duur>PT02M02S</duur> 
      </Nummer> 
      </Nummers> 
     </Album> 
     </Albums> 
    </Artiest> 
    </Artiesten> 
    <Albums> 
    <Album albumid="1"> 
     <Titel>Album1</Titel> 
     <prijs valuta="Euro">19.99</prijs> 
     <uitgiftejaar>1999</uitgiftejaar> 
     <Nummers> 
     <Nummer nummerid="1"> 
      <titel>Happy Sundays</titel> 
      <duur>PT02M02S</duur> 
     </Nummer> 
     </Nummers> 
    </Album> 
    </Albums> 
    <Nummers> 
    <Nummer nummerid="1"> 
     <titel>Happy Sundays</titel> 
     <duur>PT02M02S</duur> 
    </Nummer> 
    </Nummers> 
</Collection> 

而且我想desirialize這樣的:

XDocument doc = XDocument.Load(file); 
       XmlSerializer xmlSerializer = new XmlSerializer(typeof(Collection)); 
       using (var reader = doc.Root.CreateReader()) 
       { 
        Collection collection = (Collection) xmlSerializer.Deserialize(reader); 

       } 

出於某種原因,我無法找到Collection對象中的列表全部爲空。調試顯示XDocument中的加載文件是有效的。

編輯:我設法縮小了這個問題。它正確地反序列化列表,只有那些列表中的對象的所有屬性都是空的。

回答

0
Collection collection = null; 
string path = "file.xml"; 

XmlSerializer serializer = new XmlSerializer(typeof(Collection)); 

StreamReader reader = new StreamReader(path); 
collection = (Collection)serializer.Deserialize(reader); 
reader.Close(); 
+0

nope,仍然返回空對象 –

1

找到我的答案

我不得不修改我的目錄屬性這樣:

[XmlElement("Artiesten", typeof(List<Artiest>))] 
    public List<Artiest> Artiesten { get; set; } 
    [XmlElement("Albums", typeof(List<Album>))] 
    public List<Album> Albums { get; set; } 
    [XmlElement("Nummers", typeof(List<Nummer>))] 
    public List<Nummer> Nummers { get; set; } 
0

您需要重新從你的列表中移動[XmlElement]標籤。否則,它使用不同的XML結構。

例如,而不是窩在單個Artiesten元素內所有Artiest對象(這是您當前的XML是什麼),它實際上將它們彼此相鄰像這樣:

<Artiesten artiestid="1"> 
     <Naam>Harry</Naam> 
     <Albums> 
     <Album albumid="1"> 
      <Titel>Album1</Titel> 
      <prijs valuta="Euro">19.99</prijs> 
      <uitgiftejaar>1999</uitgiftejaar> 
      <Nummers> 
      <Nummer nummerid="1"> 
       <titel>happy Sundays</titel> 
       <duur>PT02M02S</duur> 
      </Nummer> 
      </Nummers> 
     </Album> 
     </Albums> 
    </Artiesten> 
    <Artiesten artiestid="2"> 
     <Naam>Harry</Naam> 
     <Albums> 
     <Album albumid="1"> 
      <Titel>Album1</Titel> 
      <prijs valuta="Euro">19.99</prijs> 
      <uitgiftejaar>1999</uitgiftejaar> 
      <Nummers> 
      <Nummer nummerid="1"> 
       <titel>happy Sundays</titel> 
       <duur>PT02M02S</duur> 
      </Nummer> 
      </Nummers> 
     </Album> 
     </Albums> 
    </Artiesten> 
    <Artiesten artiestid="3"> 
     <Naam>Harry</Naam> 
     <Albums> 
     <Album albumid="1"> 
      <Titel>Album1</Titel> 
      <prijs valuta="Euro">19.99</prijs> 
      <uitgiftejaar>1999</uitgiftejaar> 
      <Nummers> 
      <Nummer nummerid="1"> 
       <titel>happy Sundays</titel> 
       <duur>PT02M02S</duur> 
      </Nummer> 
      </Nummers> 
     </Album> 
     </Albums> 
    </Artiesten> 

因此,嘗試重新定義你的階級作爲階級:

[Serializable] 
[XmlRoot(ElementName = "Collection")] 
public class Collection 
{ 
    public Collection() 
    { 
     Artiesten = new List<Artiest>(); 
     Albums = new List<Album>(); 
     Nummers = new List<Nummer>(); 
    } 

    public List<Artiest> Artiesten { get; set; } 
    public List<Album> Albums { get; set; } 
    public List<Nummer> Nummers { get; set; } 

} 

[Serializable] 
public class Artiest 
{ 
    [XmlAttribute("artiestid")] 
    public int ArtiestId { get; set; } 
    [XmlElement(ElementName = "Naam")] 
    public String Naam { get; set; } 

    public List<Album> Albums { get; set; } 
} 
0

你想XmlArray,不是的XmlElement:

[XmlArray("Artiesten")] 
[XmlArrayItem("Artiest")] 
public List<Artiest> ... 

實際上,這是列表的默認行爲,因此您也可以完全刪除該屬性。