对象的动态XmlRootElement

时间:2013-07-31 10:48:51

标签: c# web-services xml-parsing xml-serialization

我正在开发一个使用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")],但我想应该有一个简单的解决方案吗?

修改: 应我的接收部分Henk的要求 我收到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>标记中?

1 个答案:

答案 0 :(得分:1)

您可以像这样插入<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>代码并直接从item XElement反序列化。