代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

如何将另一个命名空间添加到WCF联合源?

  •  1
  • Pablo Fernandez  · 技术社区  · 15 年前

    在我的提要生成代码中,我有如下内容:

    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>
    

    如何在channel元素中获取iTunes命名空间的声明(xmlns:itunes=“http://www.itunes.com/dtds/podcast-1.0.dtd”),以便不必在每个itunes元素上重复声明?

    我的源是使用System.ServiceModel.Syndication.SyndicationFeed创建的。

    2 回复  |  直到 15 年前
        1
  •  6
  •   Pablo Fernandez    15 年前

    我正确支持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();
            }
        }
    }
    
        2
  •  1
  •   Kirk Liemohn    15 年前

    这可能有帮助。我也在试着做同样的事情,但还没看到整个画面…

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