2011-05-31 66 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