2011-05-31 67 views
1

我有下面的XML我試圖用XmlSerialiser到deserialise:使用的XMLSerializer deserialise與元素的數組類型相同的根元素

<playlist> 
    <id>43712</id> 
    <title>Eleven | Eleven</title> 
    <description>Eleven</description> 
    <creationDate>2010-12-01T17:54:44</creationDate> 
    <lastModifiedDate>2011-05-27T01:32:58</lastModifiedDate> 
    <status>ACTIVE</status> 
    <syndicatedPartners/> 
    <mediaList/> 
    <childPlaylists> 
    <playlist> 
     <id>43781</id> 
     <title>TV Shows | TV Shows</title> 
     <description></description> 
     <creationDate>2010-12-10T16:37:00</creationDate> 
     <lastModifiedDate>2011-05-09T06:03:09</lastModifiedDate> 
     <status>ACTIVE</status> 
     <syndicatedPartners/> 
     <imagePath>http://media.movideo.com/images/112/playlist/43781/</imagePath> 
     <defaultImage> 
     <url>http://media.movideo.com/images/112/playlist/43781/96x128.png</url> 
     <height>128</height> 
     <width>96</width> 
     </defaultImage> 
    </playlist> 
    <playlist> 
     <id>43787</id> 
     <title>Movies | Movies</title> 
     <description></description> 
     <creationDate>2010-12-10T16:49:13</creationDate> 
     <lastModifiedDate>2011-05-06T01:39:23</lastModifiedDate> 
     <status>ACTIVE</status> 
     <syndicatedPartners/> 
     <imagePath>http://media.movideo.com/images/112/playlist/43787/</imagePath> 
     <defaultImage> 
     <url>http://media.movideo.com/images/112/playlist/43787/96x128.png</url> 
     <height>128</height> 
     <width>96</width> 
     </defaultImage> 
    </playlist> 
    <playlist> 
     <id>44020</id> 
     <title>Eleven | This Week On Eleven</title> 
     <description></description> 
     <creationDate>2011-01-05T08:17:09</creationDate> 
     <lastModifiedDate>2011-05-30T08:47:13</lastModifiedDate> 
     <status>ACTIVE</status> 
     <syndicatedPartners/> 
     <imagePath>http://media.movideo.com/images/112/playlist/44020/</imagePath> 
     <defaultImage> 
     <url>http://media.movideo.com/images/112/playlist/44020/96x128.png</url> 
     <height>128</height> 
     <width>96</width> 
     </defaultImage> 
    </playlist> 
    <playlist> 
     <id>44758</id> 
     <title>Fashion | Australian Fashion Week</title> 
     <description></description> 
     <creationDate>2011-04-28T23:58:01</creationDate> 
     <lastModifiedDate>2011-05-06T05:48:22</lastModifiedDate> 
     <status>ACTIVE</status> 
     <syndicatedPartners/> 
     <imagePath>http://media.movideo.com/images/140/playlist/44758/</imagePath> 
     <defaultImage> 
     <url>http://media.movideo.com/images/140/playlist/44758/96x128.png</url> 
     <height>128</height> 
     <width>96</width> 
     </defaultImage> 
    </playlist> 
    </childPlaylists> 
    <imagePath>http://media.movideo.com/images/112/playlist/43712/</imagePath> 
    <defaultImage> 
    <url>http://media.movideo.com/images/112/playlist/43712/96x128.png</url> 
    <height>128</height> 
    <width>96</width> 
    </defaultImage> 
</playlist> 

在我的C#代碼,我有:

public class Response 
{ 
    public bool success; 
    public string responseType; 
} 

[XmlRootAttribute("playlist", Namespace="", IsNullable=false)] 
public class PlaylistResponse : Response 
{ 
    public int id; 
    public string title; 
    public string description; 
    public List<PlaylistResponse> childPlaylists; 
} 

XmlReader reader = XmlReader.Create(responseStream); 
XmlSerializer serializer = new XmlSerializer(typeof(PlaylistResponse)); 
PlaylistResponse response = (PlaylistResponse)serializer.Deserialize(reader); 
state.callback((Response) response, state.data); 

但childPlaylist似乎總是空的。

反序列化這種XML的正確方法是什麼,特別是使用多個「childPlaylists」?

謝謝。

+0

順便說一句,據我可以在XML序列化代碼看,你需要使用數組,而不是列出 – abatishchev 2011-05-31 10:21:42

回答

1

this question and answer


[XmlRootAttribute("playlist")] 
public class PlaylistResponse 
{ 
    public int id; 
    public string title; 
    public string description; 

    [XmlArray(ElementName="childPlaylists")] 
    [XmlArrayItem(typeof(PlaylistResponse), ElementName="playlist")] 
    public PlaylistResponse[] ChildPlaylists; 
} 

XmlReader reader = XmlReader.Create(new StringReader(xml)); // your xml above 
XmlSerializer serializer = new XmlSerializer(typeof(PlaylistResponse)); 
PlaylistResponse response = (PlaylistResponse)serializer.Deserialize(reader); 

int count = response.ChildPlaylists.Length; // 4 
+0

我試圖複製正確的代碼,但沒有奏效。我認爲我的問題是它試圖引用自身,這是根元素,我沒有指定它可以同時是根和子元素。 – 2011-05-31 09:57:34

+0

@亞當:我更新了我的答案。它適用於我用XML給我 – abatishchev 2011-05-31 10:19:06

+0

當我嘗試response.ChildPlaylists.Length – 2011-06-01 13:20:20

0

僅將標記PlaylistResponse作爲根元素與XmlRootAttribute。也添加XmlElementAttribute。

+0

我不知道該XmlRootAttribute做什麼或它是如何工作?你能提供一個我可以放置XmlElementAttribute的例子? – 2011-05-31 09:36:18

+0

XmlRootAttribute(「playlist」)表示:解組**名爲「playlist」的**元素給這個類。雖然解組孩子播放列表,但它不能將此「播放列表」元素映射到類。在XmlRootAttribute之後放置屬性 – artplastika 2011-05-31 09:43:41

+0

放置[XmlElementAttribute(「playlist」)]會產生「屬性在此聲明類型上無效,它在屬性,索引器,字段,參數,返回'聲明只。 – 2011-05-31 09:50:56

0

添加XmlArrayItem屬性命名元素的名稱和XmlRoot指定的根元素的名稱:

[XmlRoot("playlist")] 
public class PlaylistResponse : Response 
{ 
    public int id; 
    public string title; 
    public string description; 
    [XmlArrayItem("playlist")] 
    public List<PlaylistResponse> childPlaylists; 
} 
+0

它似乎沒有工作......我嘗試了一個List <>和數組,以及小寫「播放列表」和[XmlArray],但仍然是一個0項數。 – 2011-05-31 09:56:25

+0

fixed case typo:playList =>播放列表中的XmlArrayItem屬性。 – Stefan 2011-05-31 10:04:46