在c# Win8.1应用程序中读取XML元素扩展
本文关键字:读取 XML 元素 扩展 应用程序 Win8 | 更新日期: 2023-09-27 18:14:57
我是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中看过这些线程:使用SyndicationFeed从RSS中获取媒体元素,以及其中链接的一个,它们不适合我。当我尝试使用var elements = rss.Feed.Items。选择多个(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);
}
我不熟悉手机应用程序,但你会把这些数据放入某种中继器,数据网格等,是吗?由于不熟悉Task泛型对象,我仍然冒昧地猜测您可以对List使用c#键值对类,然后直接在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文档。不要被它迷惑。
看起来很简单…我以前用过这样的解决方案,相信这就是你想要的。
SyndicationItem有一个GetXMLDocument方法,该方法接受SourceFormat(如Rss20),然后生成一个XML字符串,您可以使用GEtElementsByTagName(或ID)解析该字符串。一旦有了这些,就可以在循环中遍历重复的标记,并使用attributes . getnameditem()获取XML标记的命名属性。在Rss20格式的xml中搜索媒体内容标签时,"媒体"似乎被截断了,所以所有需要搜索的内容都是内容。
var allImages = item.GetXmlDocument(feed.SourceFormat).GetElementsByTagName("content");
foreach (var s in allImages)
{
Debug.WriteLine(s.Attributes.GetNamedItem("url").InnerText;)
}