【问题标题】:Dynamic XmlRootElement for object对象的动态 XmlRootElement
【发布时间】:2013-07-31 10:48:51
【问题描述】:

我正在开发一个使用 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;

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

【问题讨论】:

  • 看起来不太适合序列化程序的格式。您可以轻松地预处理 XML 以插入 &lt;item&gt; 标记。
  • @HenkHolterman 您的意思是像将 xml 作为字符串读取,将 &lt;data 替换为 &lt;item,将 &lt;/data&gt; 替换为 &lt;/item&gt;
  • 我假设你有一个字符串,我更喜欢通过 XElement 进行突变。也许插入而不是替换标签,这取决于。
  • 我通过 Streamreader 读取了 xml。我将不得不深入研究 XElement。
  • 当您发布阅读/接收部分时,您可以获得一些帮助。

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


【解决方案1】:

您可以像这样插入&lt;image&gt; 标签:

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 属性。

或者,您可以跳过 &lt;data&gt; 标记并直接从 item XElement 反序列化。

【讨论】:

  • 很好,我会试试这个。谢谢
猜你喜欢
  • 2014-06-29
  • 2012-11-14
  • 1970-01-01
  • 2020-10-29
  • 2013-03-02
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多