0

我是 C# 和 Windows 应用程序开发的新手,我的经验主要是在 python 中,但我试图挑战自己学习新东西。

我一直在通过制作 Windows 商店应用程序来练习/学习 c#,在完成了一些 WinJS/HTML5 教程之后,我开始学习本教程:http: //msdn.microsoft.com/en-us/library/windows/apps/br211380。 aspx

我已经完成了教程(包括修改 8.1 应用程序的说明,因为教程落后了。我现在正在尝试调整我的应用程序以处理其他类型的数据。

我正在尝试从帖子中的每个项目中提取所有 media:image 标签,以便我可以显示它们。这是我的来自 RSS 提要的 XML 数据的结构。

        <item>
        <title>Post with photos</title>
        <link>http://website.com/2014/07/23/post-1//</link>
        <comments>http://website.com/2014/07/23/post-1/#comments</comments>
        <pubDate>Wed, 23 Jul 2014 15:45:02 +0000</pubDate>
        <dc:creator><![CDATA[Author]]></dc:creator>
                <category><![CDATA[Post]]></category>

        <guid isPermaLink="false">http://www.website.com/p?1</guid>
        <description><![CDATA[description here]]></description>
        <wfw:commentRss>http://www.website.com/post/1/feed/</wfw:commentRss>
        <slash:comments>0</slash:comments>
        <enclosure type="image/jpeg" length="1" url="http://0.gravatar.com/avatar/" />

        <media:thumbnail url="http://www.website.com/thumbnail_urle1406130272443.jpg?w=500" />
            <media:content url="http://0.gravatar.com/avatar/" medium="image">
            <media:category>author</media:category>
        </media:content>
            <media:content url="http://www.website.com/post/1/233-e1406130272443.jpg" medium="image">
            <media:title>image-23</media:title>
                    </media:content>
            <media:content url="http://www.website.com/post/1/163.jpg" medium="image">
            <media:title>image-16</media:title>
                    </media:content>
            <media:content url="http://www.website.com/post/1/73.jpg" medium="image">
            <media:title>bimage-7</media:title>
                    </media:content>
        </item>

我在 HTML5/JS 中实现了这个,当我这样做时,我使用了这个方法:

        var thumb = post.querySelector(
            "thumbnail").attributes.getNamedItem("url").textContent;
        var postImages = post.querySelectorAll("content");

        var ImageList = [];
        for (var imgIndex = 1; imgIndex < postImages.length; imgIndex++) {
            var imgHTML = "<img src='" + postImages[imgIndex].attributes.getNamedItem("url").textContent + "'</img><br/>";
            var ImageList = ImageList += imgHTML;
        }

但自然.. 这在 C# 中是行不通的。我在 SO:Get media elements from RSS using SyndicationFeed中查看了这些线程以及其中链接的那个,它们对我不起作用。当我尝试使用 var elements = rss.Feed.Items.SelectMany(s => s.ElementExtensions.Select(x => x.GetObject().Value));

当我使用我的代码将它们放在一起时,我没有可用的 GetObject 方法。这是我当前的数据模型。

        private async Task<FeedData> GetFeedAsync(string feedUriString)
        {
            Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();
            Uri feedUri = new Uri(feedUriString);

            try
            {
                SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);

                // This code is executed after RetrieveFeedAsync returns the SyndicationFeed.
                // Process the feed and copy the data you want into the FeedData and FeedItem classes. 
                FeedData feedData = new FeedData();

                if (feed.Title != null && feed.Title.Text != null)
                {
                    feedData.Title = feed.Title.Text;
                }
                if (feed.Subtitle != null && feed.Subtitle.Text != null)
                {
                    feedData.Description = feed.Subtitle.Text;
                }
                if (feed.Items != null && feed.Items.Count > 0)
                {
                    // Use the date of the latest post as the last updated date.
                    feedData.PubDate = feed.Items[0].PublishedDate.DateTime;

                    foreach (SyndicationItem item in feed.Items)
                    {
                        FeedItem feedItem = new FeedItem();
                        if (item.Title != null && item.Title.Text != null)
                        {
                            feedItem.Title = item.Title.Text;
                        }
                        if (item.PublishedDate != null)
                        {
                            feedItem.PubDate = item.PublishedDate.DateTime;
                        }
                        if (item.Authors != null && item.Authors.Count > 0)
                        {
                            feedItem.Author = item.Authors[0].Name.ToString();
                        }
                        // Handles RSS / Atom Feed differences..
                        if (feed.SourceFormat == SyndicationFormat.Atom10)
                        {
                            if (item.Content != null && item.Content.Text != null)
                            {
                                feedItem.Content = item.Content.Text;
                            }
                            if (item.Id != null)
                            {
                                feedItem.Link = new Uri(item.Id);
                            }
                        }
                        else if (feed.SourceFormat == SyndicationFormat.Rss20)
                        {
                            if (item.Summary != null && item.Summary.Text != null)
                            {
                                feedItem.Content = item.Summary.Text;
                            }
                            if (item.Links != null && item.Links.Count > 0)
                            {
                                feedItem.Link = item.Links[0].Uri;
                            }
                        }
                        feedData.Items.Add(feedItem);
                    }
                }
                return feedData;
            }
            catch (Exception)
            {
                return null;
            }
        }

我尝试设置断点并查看我的 RSS2.0 联合处理程序中的项目数据,我可以看到 var media = item.ElementExtensions; 准确计算了我帖子中的所有元素扩展,以及它们的标题。(NodeName “content”,NodeValue 是元素中的“title”。但 url 标签没有 URI。)

我正在寻找某种方法来将获取这些媒体的某种方式:内容、媒体缩略图等集成到一个列表中,以便我可以将它们组装起来,稍后在我的应用程序中将它们用于 HTML 内容。

任何意见,将不胜感激!

编辑:

更多我的代码..

 public class FeedData
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime PubDate { get; set; }
        public Uri Image { get; set; }

        private List<FeedItem> _Items = new List<FeedItem>();
        public List<FeedItem> Items
        {
            get
            {
                return this._Items;
            }
        }

    }

    // Holds info for a single blog post
    public class FeedItem
    {
        public string Title { get; set; }
        public string Author { get; set; }
        public string Content { get; set; }
        public DateTime PubDate { get; set; }
        public Uri Link { get; set; }
    }

    // Holds a collection of blog feeds (FeedData), and contains methods needed to retrieve
    // the feeds
    public class FeedDataSource
    {
        private ObservableCollection<FeedData> _Feeds = new ObservableCollection<FeedData>();
        public ObservableCollection<FeedData> Feeds
        {
            get
            {
                return this._Feeds;
            }
        }

        public async Task GetFeedsAsync()
        {
            Task<FeedData> feed1 =
                GetFeedAsync("http://url.com/feed");
            Task<FeedData> feed2 =
                GetFeedAsync("http://url.com/feed");
            ... 
            ...

            this.Feeds.Add(await feed1);
                ...
                ...
                ...
            this.Feeds.Add(await feed15);

        }
4

2 回答 2

2

我不熟悉电话应用程序,但您会将这些数据放入某种中继器、数据网格等中,是吗?不熟悉 Task 通用对象我仍然会冒险猜测您可以将 C# 键值对类与 List 一起使用,然后直接在 Repeater Grid 中的这个对象中使用。我相信任何实现 IEnumerable (List 应该)的对象都可以使用 KeyValuePair 进行迭代

让我知道更多你想做什么。在我看来

foreach KeyValuePair KVP in ListObject
{
   //Access KVP.key and values with your code here ...
}

一个更清晰的例子是使用 KVP 迭代字典对象:

    foreach (KeyValuePair<string, string> entry in dictTestEasement)
    {
        builder.RowFormat.Height = 0.2; //force row height by text font by setting height small
        builder.InsertCell();
        builder.Font.Bold = true;
        builder.InsertHtml(entry.Key);
        builder.Font.Bold = false;
        builder.InsertCell();
        builder.InsertHtml(entry.Value);
    }

在这种情况下,构建器是一个用于文档构建的全局对象(Aspose Words Object)——它正在构建一个 Word 文档。不要被它抛弃。

看起来很简单......我以前使用过这样的解决方案,并相信这就是你正在寻找的。

于 2014-07-25T16:26:31.680 回答
0

SyndicationItem 有一个 GetXMLDocument 方法,该方法采用 SourceFormat(如 Rss20),然后生成可以使用 GEtElementsByTagName(或 ID)解析的 XML 字符串。一旦你有了它,你就可以在循环中遍历重复的标签,并使用 Attributes.GetNamedItem() 来获取 XML 标签的命名属性。在探索 xml 以获取媒体:Rss20 格式的内容标签时,似乎“媒体”被删除了,所以只需要搜索内容即可。

var allImages = item.GetXmlDocument(feed.SourceFormat).GetElementsByTagName("content");
foreach (var s in allImages)
{
Debug.WriteLine(s.Attributes.GetNamedItem("url").InnerText;)
}
于 2014-07-29T18:49:56.323 回答