我正在开发一个使用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>
标记中?
答案 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反序列化。