簡體   English   中英

C#XML序列化元素名稱空間

[英]C# XML Serialization Element namespace

我正在嘗試將一些c#類序列化為RSS提要的xml。 我還有一個問題,縮略圖元素需要媒體作為命名空間,但我一直無法弄清楚如何正確添加它。 現在,我可以使用字符串替換操作,但是我寧願使用正確的方法。 我認為這並不重要,但我正在與Umbraco合作。

我的代碼當前生成的內容是:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:media="http://search.yahoo.com/mrss" version="2.0">
  <channel>
    <title>blog.example.com</title>
    <link>http://blog.example.com/</link>
    <description />
    <item>
      <title>Fake Post 1</title>
      <link>http://www.example.com/post-1</link>
      <description />
      <pubDate>Thu, 25 Sep 2014 07:38:15 GMT</pubDate>
      <guid isPermaLink="false">http://www.example.com/post-1</guid>
      <media_x003A_thumbnail url="http://www.example.com/post-1/1.png" width="9001" height="9001" />
    </item>
    <item>
      <title>Fake Post 2</title>
      <link>http://www.example.com/post-2</link>
      <description />
      <pubDate>Thu, 25 Sep 2014 07:38:15 GMT</pubDate>
      <guid isPermaLink="false">http://www.example.com/post-2</guid>
      <media_x003A_thumbnail url="http://www.example.com/post-2/2.png" width="9001" height="9001" />
    </item>
  </channel>
</rss>

我希望我的代碼生成:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:media="http://search.yahoo.com/mrss" version="2.0">
  <channel>
    <title>blog.example.com</title>
    <link>http://blog.example.com/</link>
    <description />
    <item>
      <title>Fake Post 1</title>
      <link>http://www.example.com/post-1</link>
      <description />
      <pubDate>Thu, 25 Sep 2014 07:38:15 GMT</pubDate>
      <guid isPermaLink="false">http://www.example.com/post-1</guid>
      <media:thumbnail url="http://www.example.com/post-1/1.png" width="9001" height="9001" />
    </item>
    <item>
      <title>Fake Post 2</title>
      <link>http://www.example.com/post-2</link>
      <description />
      <pubDate>Thu, 25 Sep 2014 07:38:15 GMT</pubDate>
      <guid isPermaLink="false">http://www.example.com/post-2</guid>
      <media:thumbnail url="http://www.example.com/post-2/2.png" width="9001" height="9001" />
    </item>
  </channel>
</rss>

c#類(最初使用“粘貼為xml類”生成,但我必須對其進行一些修改:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Syndication;
using System.Web;
using System.Xml;
using System.Xml.Serialization;


/// <remarks/>
[XmlRoot("rss")]
[XmlTypeAttribute(AnonymousType = true)]
public partial class rss {

  private rssChannel channelField;

  private string versionField;

  private string mediaField;

  /// <remarks/>
  public rssChannel channel {
    get {
      return this.channelField;
    }
    set {
      this.channelField = value;
    }
  }

  /// <remarks/>
  [XmlAttributeAttribute()]
  public string version {
    get {
      return this.versionField;
    }
    set {
      this.versionField = value;
    }
  }

  [XmlNamespaceDeclarations]
  public XmlSerializerNamespaces xmlns;

}

/// <remarks/>
[XmlTypeAttribute(AnonymousType = true)]
public partial class rssChannel {

  private string titleField;

  private string linkField;

  private string descriptionField;

  private rssChannelItem[] itemField;

  /// <remarks/>
  public string title {
    get {
      return this.titleField;
    }
    set {
      this.titleField = value;
    }
  }

  /// <remarks/>
  public string link {
    get {
      return this.linkField;
    }
    set {
      this.linkField = value;
    }
  }

  /// <remarks/>
  public string description {
    get {
      return this.descriptionField;
    }
    set {
      this.descriptionField = value;
    }
  }

  /// <remarks/>
  [XmlElementAttribute("item")]
  public rssChannelItem[] item {
    get {
      return this.itemField;
    }
    set {
      this.itemField = value;
    }
  }
}

/// <remarks/>
[XmlTypeAttribute(AnonymousType = true)]
public partial class rssChannelItem {

  private string titleField;

  private string linkField;

  private string descriptionField;

  private string pubDateField;

  private rssChannelItemGuid guidField;

  private rssChanelItemMediaThumbnail mediaThumbnailField;

  /// <remarks/>
  public string title {
    get {
      return this.titleField;
    }
    set {
      this.titleField = value;
    }
  }

  /// <remarks/>
  public string link {
    get {
      return this.linkField;
    }
    set {
      this.linkField = value;
    }
  }

  /// <remarks/>
  public string description {
    get {
      return this.descriptionField;
    }
    set {
      this.descriptionField = value;
    }
  }

  /// <remarks/>
  public string pubDate {
    get {
      return this.pubDateField;
    }
    set {
      this.pubDateField = value;
    }
  }

  /// <remarks/>
  public rssChannelItemGuid guid {
    get {
      return this.guidField;
    }
    set {
      this.guidField = value;
    }
  }

  //hack TODO fix
  [XmlElement(ElementName = "media:thumbnail")]
  public rssChanelItemMediaThumbnail mediaThumbnail {
    get {
      return this.mediaThumbnailField;
    }
    set {
      this.mediaThumbnailField = value;
    }
  }

}

/// <remarks/>
[XmlTypeAttribute(AnonymousType = true)]
public partial class rssChannelItemGuid {

  private bool isPermaLinkField;

  private string valueField;

  /// <remarks/>
  [XmlAttributeAttribute()]
  public bool isPermaLink {
    get {
      return this.isPermaLinkField;
    }
    set {
      this.isPermaLinkField = value;
    }
  }

  /// <remarks/>
  [XmlTextAttribute()]
  public string Value {
    get {
      return this.valueField;
    }
    set {
      this.valueField = value;
    }
  }
}

[XmlTypeAttribute(AnonymousType = true)]
public partial class rssChanelItemMediaThumbnail {

  private string urlField;

  private string widthField;

  private string heightField;

  /// <remarks/>
  [XmlAttributeAttribute()]
  public string url {
    get {
      return this.urlField;
    }
    set {
      this.urlField = value;
    }
  }

  /// <remarks/>
  [XmlAttributeAttribute()]
  public string width {
    get {
      return this.widthField;
    }
    set {
      this.widthField = value;
    }
  }

  /// <remarks/>
  [XmlAttributeAttribute()]
  public string height {
    get {
      return this.heightField;
    }
    set {
      this.heightField = value;
    }
  }

}

構建xml的函數:

/// <summary>
/// Create a BlogRssFeedModel
/// </summary>
/// <param name="content"></param>
/// <param name="culture"></param>
/// <returns></returns>
public static BlogRssFeedModel CreateBlogRssFeedModel(IPublishedContent content, CultureInfo culture) {
  IPublishedContent blogHomePage = content.AncestorsOrSelf(1).FirstOrDefault();
  BlogRssFeedModel blogRssFeedModel = new BlogRssFeedModel(content, culture);
  List<String> validDocumentTypes = new List<String>() { "BlogEntry" };
  List<IPublishedContent> blogPosts = blogHomePage.Descendants().Where(x => validDocumentTypes.Contains(x.DocumentTypeAlias)).OrderByDescending(x => x.GetPropertyValue<DateTime>("sortDate")).ToList();
  rss blogRssFeed = new rss();
  blogRssFeed.version = "2.0";
  blogRssFeed.xmlns = new XmlSerializerNamespaces();
  blogRssFeed.xmlns.Add("media", "http://search.yahoo.com/mrss");
  blogRssFeed.channel = new rssChannel();
  blogRssFeed.channel.title = blogHomePage.Name;
  blogRssFeed.channel.description = blogHomePage.GetPropertyValue<string>("pageDescription");
  blogRssFeed.channel.link = blogHomePage.Url;
  blogRssFeed.channel.item = blogPosts.Select(x => CreateRssChannelItem(x)).ToArray();
  //some (terrible) manual string hacks TODO fix this bs
  //string blogXml = CreateBlogXml(blogRssFeed).Replace("_x003A_", ":");
  string blogXml = CreateBlogXml(blogRssFeed);
  blogRssFeedModel.content = new HtmlString(blogXml);
  return blogRssFeedModel;
}

/// <summary>
/// Create a rssChannelItem for the blog's rss feed.
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public static rssChannelItem CreateRssChannelItem(IPublishedContent x) {
  rssChannelItem element = new rssChannelItem();
  element.description = x.GetPropertyValue<string>("excerpt");
  element.link = x.Url;
  element.title = x.Name;
  element.pubDate = x.GetPropertyValue<DateTime>("sortDate").ToString("r");
  element.guid = new rssChannelItemGuid() { isPermaLink = false, Value = x.Url };
  element.mediaThumbnail = new rssChanelItemMediaThumbnail() { height = "", width = "", url = "" }; //to do populate data
  return element;
}

public static string CreateBlogXml(rss node) {
  System.Xml.Serialization.XmlSerializer xSerial = new System.Xml.Serialization.XmlSerializer(node.GetType());
  var xns = new XmlSerializerNamespaces();
  xns.Add("", "");
  MemoryStream ms = new MemoryStream();
  XmlTextWriter xmlTextWriter = new XmlTextWriter(ms, Encoding.UTF8);
  xmlTextWriter.Formatting = Formatting.Indented;
  xSerial.Serialize(xmlTextWriter, node, xns);
  ms = (MemoryStream)xmlTextWriter.BaseStream;
  return Encoding.UTF8.GetString(ms.ToArray());
}

這里:

[XmlElement(ElementName = "media:thumbnail")]

這是錯誤的。 元素名稱thumbnail ; 命名空間http://search.yahoo.com/mrss media只是名稱空間別名。 因此,我們應該做的第一件事就是修復該問題:

[XmlElement(ElementName = "thumbnail", Namespace = "http://search.yahoo.com/mrss")]

您已經將media名稱空間添加到blogRssFeed.xmlns

blogRssFeed.xmlns.Add("media", "http://search.yahoo.com/mrss");

所以其余的應該已經可以從那里工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM