使用SyndicationFeed从xml中检索自定义元素值

本文关键字:自定义 元素 检索 SyndicationFeed xml 使用 | 更新日期: 2023-09-27 18:03:39

我正试图找出一种方法来检索itunes元素从这个xml提要,不能为我的生活弄清楚。

<item>
    <title>Episode 41 - Brobdingnagian Lunches To Die For</title>
    <pubDate>Fri, 17 Jul 2015 13:00:00 GMT</pubDate>
    <dcterms:modified>2015-07-17</dcterms:modified>
    <dcterms:created>2015-07-17</dcterms:created>
    <link>http://starttocontinue.podomatic.com</link>
    <dc:creator>Start To Continue</dc:creator>
    <itunes:duration>0</itunes:duration>
    <itunes:explicit>yes</itunes:explicit>
    <itunes:order>1</itunes:order>
    ...
</item>

我为每个循环使用一个标准来设置简单的元素,如title等。

foreach (SyndicationItem item in feed.Items)
{
    string subject = item.Title.Text;
    ...
}

但不知道如何访问itunes的,谁有一个想法,如果这是可能的或如何做到这一点?

使用SyndicationFeed从xml中检索自定义元素值

您可以使用ElementExtensions属性来获取额外的元素:

const string ns = "http://www.itunes.com/dtds/podcast-1.0.dtd";
var duration = item.ElementExtensions.ReadElementExtensions<XElement>("duration", ns)
                   .Select(e => e.Value).First();

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication37
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
            "<item xmlns:dcterms='"www.myspace.com'" xmlns:dc='"www.myspace.com'" xmlns:itunes='"www.myspace.com'">" +
            "<title>Episode 41 - Brobdingnagian Lunches To Die For</title>" +
            "<pubDate>Fri, 17 Jul 2015 13:00:00 GMT</pubDate>" +
            "<dcterms:modified>2015-07-17</dcterms:modified>" +
            "<dcterms:created>2015-07-17</dcterms:created>" +
            "<link>http://starttocontinue.podomatic.com</link>" +
            "<dc:creator>Start To Continue</dc:creator>" +
            "<itunes:duration>0</itunes:duration>" +
            "<itunes:explicit>yes</itunes:explicit>" +
            "<itunes:order>1</itunes:order>" +
            "</item>";
            XDocument doc = XDocument.Parse(input);
            var results = doc.Descendants("item").Select(x => new
            {
                title = x.Element("title").Value,
                pubDate = x.Element("pubDate").Value,
                modified = x.Elements().Where(y => y.Name.LocalName == "modified").FirstOrDefault().Value,
                created = x.Elements().Where(y => y.Name.LocalName == "created").FirstOrDefault().Value,
                link = x.Element("link").Value,
                creator = x.Elements().Where(y => y.Name.LocalName == "creator").FirstOrDefault().Value,
                duration = x.Elements().Where(y => y.Name.LocalName == "duration").FirstOrDefault().Value,
                explicit1 = x.Elements().Where(y => y.Name.LocalName == "explicit").FirstOrDefault().Value,
                order = x.Elements().Where(y => y.Name.LocalName == "order").FirstOrDefault().Value,
            }).ToList();
        }
    }
}

最后成功了。

XElement ele = extension.GetObject<XElement>();
if (ele.ToString().StartsWith("<itunes:image"))
    {
      int index = ele.ToString().IndexOf("'" xmlns:itunes");
      if (index > 0)
        image = ele.ToString().Substring(0, index).Replace("<itunes:image href='"", "");
    }

我正在寻找类似的<itunes:episode>标签。我知道这是一个相当老的问题,但我想我应该为可能在这里结束的其他人添加我的方法。我让它工作:

var episode = item.Element("{http://www.itunes.com/dtds/podcast-1.0.dtd}episode").Value;

对于其中一个示例,我将使用:

var duration= item.Element("{http://www.itunes.com/dtds/podcast-1.0.dtd}duration").Value;