【问题标题】:Using XMLSerializer deserialise with array of elements the same type as the root element使用 XMLSerializer 对与根元素类型相同的元素数组进行反序列化
【发布时间】:2011-05-31 09:26:02
【问题描述】:

我正在尝试使用 XmlSerialiser 反序列化以下 XML:

<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”?

谢谢。

【问题讨论】:

  • 顺便说一句,据我在 XML 序列化代码中所见,您需要使用数组,而不是列表

标签: c# xml serialization mono xml-deserialization


【解决方案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

【讨论】:

  • 我尝试复制正确的代码,但没有成功。我认为我的问题是它试图引用作为根元素的自身,并且我没有指定它可以同时是根元素和子元素。
  • 在尝试 response.ChildPlaylists.Length 时,我不断收到“System.NullReferenceException:对象引用未设置为对象的实例”
  • @Adam:那么你就会出错。奇怪的。为我工作。试试我的答案the previous revision
【解决方案2】:

您仅使用 XmlRootAttribute 将 PlaylistResponse 标记为根元素。也添加 XmlElementAttribute。

【讨论】:

  • 我不确定 XmlRootAttribute 是做什么的或它是如何工作的......你能提供一个我可以放置 XmlElementAttribute 的例子吗?
  • XmlRootAttribute("playlist") 表示:将名为“playlist”的 root 元素解组到此类。在解组子播放列表时,它只是无法将此“播放列表”元素映射到一个类。将属性放在 XmlRootAttribute 之后)
  • 放置 [XmlElementAttribute("playlist")] 会产生“属性在此声明类型上无效。它仅在 `property, indexer, field, parameter, return' 声明上有效”。
【解决方案3】:

添加 XmlArrayItem 属性来命名元素名称和 XmlRoot 来指定根元素的名称:

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

【讨论】:

  • 它似乎不起作用...我尝试了 List 和数组,以及小写的“播放列表”和 [XmlArray] 但结果仍然是 0项目。
  • 修正大小写错误:playList => XmlArrayItem 属性中的播放列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多