Как добавить еще одно пространство имен в 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.


person pupeno    schedule 03.09.2009    source источник


Ответы (2)


Моим конечным решением для правильной поддержки 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();
        }
    }
}
person pupeno    schedule 08.12.2009

Это может помочь. Я пытаюсь сделать то же самое, но пока не вижу всей картины ...

http://hyperthink.net/blog/declaring-xml-namespaces-on-a-syndicationfeed/

person Kirk Liemohn    schedule 23.11.2009