对象的动态 XmlRootElement

本文关键字:XmlRootElement 动态 对象 | 更新日期: 2023-09-27 18:25:34

我正在开发一个使用 ImgUr.com API 的项目我请求图像或相册,并返回 XML。

我正在使用序列化程序将 XML 反序列化回对象。所以我为图像和相册制作了课程。

但棘手的部分来了...相册看起来像这样:

<data success="1" result="200">
  <id>x</id>
  ...
  <images>
    <item>
      <id>x</id>
      <link>http://linktoimage.jpg</link>
      ...
    </item>
    <item>
      <id>x</id>
      <link>http://linktoimage.jpg</link>
      ...
    </item>
    ...
  </images>
</data>

因此,实际图像的根元素是"item"。

但是当我通过 API 请求实际图像时,我得到以下内容:

<data success="1" result="200">
  <id>x</id>
  <link>http://linktoimage.jpg</link>
  ...
</data>

现在,根元素是"数据"。

所以我现在的解决方案是两个不同的类。一个有[XMLRootElement(Elementname = "item")],一个有[XMLRootElement(Elementname = "data")]但我想应该有一个更简单的解决方案吗?

编辑:应亨克的要求,我的接收部分我有用于接收 XML 的代码:

var request = WebRequest.Create(String.Format("{0}image/{1}.xml",     Settings.Default.ImgUrBaseUrl, albumId));
request.Headers.Add("Authorization", "Client-ID " + Settings.Default.ImgUrClientID);
var response = request.GetResponse();
var imageStream = response.GetResponseStream();
if (imageStream == null) return "";
var serilizer = new XmlSerializer(typeof(ImgUrSingleImage));
var result = serilizer.Deserialize(imageStream) as ImgUrSingleImage;

所以,我想我需要取出<data>标签,并将剩余的 xml 包装在一个新的 <item> 标签中?

对象的动态 XmlRootElement

您可以

像这样插入<image>标签:

var imageStream = response.GetResponseStream();
if (imageStream == null) return "";
XElement doc = XElement.Load(imageStream);            
XElement item = new XElement("item", doc.Elements());
doc.ReplaceNodes(item);
var reader = new StringReader(doc.ToString());
var serilizer = new XmlSerializer(typeof(ImgUrSingleImage));
var result = serilizer.Deserialize(reader) as ImgUrSingleImage;

然后,ImgUrSingleImage类应具有与列表请求通用的单个Item属性。

或者,您可以跳过<data>标记,直接从 XElement item反序列化。