[英]C# Object Serialization to XML namespace and prefix in child element only
[英]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.