【问题标题】:Parsing issues with Windows Phone7Windows Phone7 的解析问题
【发布时间】:2011-12-29 10:56:09
【问题描述】:

我正在使用 Windows Phone 7 开发一个应用程序,该应用程序显示来自特定 URI 的数据,但它不起作用。我是堆栈,请帮助我。这是我的 XML:

<rss version="2.0">
   <channel>
      <title>info</title>
      <link>http://www.info.net</link>
      <description>Trouvez toutes les actualités en direct sur info.net ...</description>
      <language>fr</language>
      <copyright></copyright>
      <pubDate></pubDate>
      <image>
            <url></url>
            <title></title>
            <link>http://www.info.net</link>
            <width>200</width>
            <height>200</height>
          </image>
    <item>
<title>Actualités » Info News » News Régionales : Main info</title>
    <link>http://www.info.net/fr/actualite/actualites_info-news_news-regionales/my-main-info/54</link>
    <pubDate>Thu, 29 Dec 2011 00:22:00 +0100</pubDate>
    <description><![CDATA[<img align='left' width='139' src='http://www.info.net/uploads/content/thumbnails/2011122902313__news.jpg'> My main info details : ...]]></description> 
</item><item>
    .
    .
    .
      </item></channel></rss>

我想显示一个列表,其中包含:

Main info (title)
http://www.info.net/uploads/content/thumbnails/2011122902313__news.jpg (description)
My main info details (description)

这是我的 C# 代码:

  var doc = XDocument.Load(new StringReader(e.Result));
            var items = from c in doc.Descendants("item")
                    select new RSSitem()
                    {
                        Title = c.Element("title").Value,
                        Photo = c.Element("img").Attribute("src").Value,
                        Description = c.Element("description").Value,
                        Link = c.Element("link").Value,
                    };
            ListBoxNews.ItemsSource = items;

【问题讨论】:

  • 什么不起作用?它不编译吗?它不显示任何东西吗?它是否显示错误/不完整/太多?
  • 它只显示标题:(
  • 旁注,我建议在您的 LINQ 查询末尾添加 ToList;否则,如果 ListBox 刷新了其项目,则将重新评估查询。
  • 你要我改变我的上市方式?

标签: c# windows-phone-7 xml-parsing


【解决方案1】:

&lt;img&gt; 标记不是 XML 文档的一部分,而是描述元素的 CDATA 节点中的 HTML 元素。

要提取它,您需要使用HtmlAgilityPackHtmlAgilityPack on NuGet)。

这是您的代码的更新版本:

(我将您的 LINQ 表达式转换为使用扩展方法,因为顺序代码在 LINQ 表达式中效果不佳)

var items = doc.Descendants("item")
               .Select(c =>
               {
                    string descriptionHtml = c.Element("description").Value;
                    HtmlDocument descriptionDoc = new HtmlDocument();

                    descriptionDoc.LoadHtml(descriptionHtml);

                    HtmlNode imageNode = doc.DocumentNode.SelectSingleNode("//img[@src]");

                    string imageUrl = (imageNode != null)
                        ? imageNode.GetAttributeValue("src", null)
                        : null;

                    // This might need further looking at, depending on your HTML
                    string description = doc.DocumentNode.InnerText;

                    return new RSSitem() 
                    { 
                        Title = c.Element("title").Value, 
                        Photo = imageUrl, 
                        Description = description, 
                        Link = c.Element("link").Value, 
                    };

               }).ToList();

【讨论】:

  • 我确实下载了 Html Agility Pack,但我无法将其添加为新参考。
  • @MarTech - 您需要 WP 版本,由于某种原因只能通过 NuGet 获得。您应该在 VS 的 Express 版本上安装 NuGet,然后添加“包引用”(通过右键单击引用)并找到 HtmlAgilityPack
  • 当我必须将其添加为参考时,我是否应该在 Windows SDK 中找到 HtmlAgilityPack?
  • 不,NuGet 是一个包管理器,允许您添加对将从 Internet 下载的内容的引用。当您右键单击引用时,您应该会看到“管理 NuGet 包...”选项。如果没有,请转到 nuget.org 并下载/安装 NuGet(它是 Microsoft 官方产品)。
【解决方案2】:

对于 c 数据节点类似于

XmlNode cDataNode = doc.SelectSingleNode("channel/description").ChildNodes[0]; 

string finalData = cDataNode.InnerText.Trim();

【讨论】:

  • 你能说得更清楚些吗
  • 他的意思是description元素中的内容是看起来像XML的文本。您不能对 CDATA 执行 xpath 查询。
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多