2009-09-03 70 views
1

在我饋送生成的代碼,我有事情,如:如何添加另一個命名空間到WCF SyndicationFeed?

XNamespace itunesNS = "http://www.itunes.com/dtds/podcast-1.0.dtd"; 
feed.ElementExtensions.Add(
    new XElement(itunesNS + "subtitle", 
     new XAttribute(XNamespace.Xmlns + "itunes", itunesNS.NamespaceName), 
     "sample subtitle").CreateReader()); 

產生這樣的:

<itunes:subtitle xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">sample subtitle</itunes:subtitle> 

我怎樣才能在iTunes命名空間的聲明(的xmlns:iTunes的=「HTTP: //www.itunes.com/dtds/podcast-1.0.dtd「),所以它不必在每個itunes元素上重複?

我的訂閱源是使用System.ServiceModel.Syndication.SyndicationFeed創建的。

回答

6

我的最終解決方案,支持正確的iTunes是:

public class ItunesFeed : SyndicationFeed { 
    private string @namespace = "http://www.itunes.com/dtds/podcast-1.0.dtd"; 
    private string prefix = "itunes"; 

    public string Subtitle {get; set;} 
    public string Author { get; set; } 
    public string Summary { get; set; } 
    public string OwnerName { get; set; } 
    public string OwnerEmail { get; set; } 
    public bool Explicit { get; set; } 
    public List<List<string>> ItunesCategories = new List<List<string>>(); 

    protected override void WriteAttributeExtensions(XmlWriter writer, string version) { 
     writer.WriteAttributeString("xmlns", prefix, null, @namespace); 
    } 

    protected override void WriteElementExtensions(XmlWriter writer, string version) { 
     WriteItunesElement(writer, "subtitle", Subtitle); 
     WriteItunesElement(writer, "author", Author); 
     WriteItunesElement(writer, "summary", Summary); 
     if (ImageUrl != null) { 
      WriteItunesElement(writer, "image", ImageUrl.ToString()); 
     } 
     WriteItunesElement(writer, "explicit", Explicit ? "yes" : "no"); 

     writer.WriteStartElement(prefix, "owner", @namespace); 
     WriteItunesElement(writer, "name", OwnerName); 
     WriteItunesElement(writer, "email", OwnerEmail); 
     writer.WriteEndElement(); 

     foreach (var category in ItunesCategories) { 
      writer.WriteStartElement(prefix, "category", @namespace); 
      writer.WriteAttributeString("text", category[0]); 
      if (category.Count == 2) { 
       writer.WriteStartElement(prefix, "category", @namespace); 
       writer.WriteAttributeString("text", category[1]); 
       writer.WriteEndElement(); 
      } 
      writer.WriteEndElement(); 
     } 
    } 

    private void WriteItunesElement(XmlWriter writer, string name, string value) { 
     if (value != null) { 
      writer.WriteStartElement(prefix, name, @namespace); 
      writer.WriteValue(value); 
      writer.WriteEndElement(); 
     } 
    } 
} 


public class ItunesItem : SyndicationItem { 
    private string @namespace = "http://www.itunes.com/dtds/podcast-1.0.dtd"; 
    private string prefix = "itunes"; 

    public string Subtitle { get; set; } 
    public string Author { get; set; } 
    public string Duration { get; set; } 
    public string Keywords { get; set; } 
    public bool Explicit { get; set; } 

    protected override void WriteElementExtensions(XmlWriter writer, string version) { 
     WriteItunesElement(writer, "subtitle", Subtitle); 
     WriteItunesElement(writer, "author", Author); 
     WriteItunesElement(writer, "summary", Summary.Text); 
     WriteItunesElement(writer, "duration", Duration); 
     WriteItunesElement(writer, "keywords", Keywords); 
     WriteItunesElement(writer, "explicit", Explicit ? "yes" : "no"); 
    } 

    private void WriteItunesElement(XmlWriter writer, string name, string value) { 
     if (value != null) { 
      writer.WriteStartElement(prefix, name, @namespace); 
      writer.WriteValue(value); 
      writer.WriteEndElement(); 
     } 
    } 
} 
相關問題