2009-09-03 8 views
1

Dans mon code de génération d'alimentation J'ai des choses comme:Comment ajouter un autre espace de noms à 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()); 

qui génère quelque chose comme ceci:

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

Comment puis-je obtenir la déclaration de l'espace de noms itunes (xmlns: itunes = "http: //www.itunes.com/dtds/podcast-1.0.dtd ") dans l'élément de canal de sorte qu'il ne doit pas être répété sur chaque élément d'itunes?

Mon flux est créé avec System.ServiceModel.Syndication.SyndicationFeed.

Répondre

6

Ma solution finale pour iTunes soutenir correctement était:

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(); 
     } 
    } 
} 
Questions connexes