【问题标题】:Get img src from XML CDATA从 XML CDATA 获取 img src
【发布时间】:2012-04-22 19:18:52
【问题描述】:

我是 C# 和 Windows Phone 开发的新手,如果我遗漏了明显的内容,请原谅我:

我想显示来自http://blog.dota2.com/feed/ 的 RSS XML 提要的缩略图。该图像位于用 HTML 编写的 CDATA 标记内。这是 XML 代码:

    <content:encoded>
<![CDATA[
<p>We celebrate Happy Bear Pun Week a day earlier as Lone Druid joins Dota 2&#8242;s cast of heroes.</p> <p><a href="http://media.steampowered.com/apps/dota2/posts/LoneDruid_full.jpg "><img class="alignnone" title="The irony is that he's allergic to fur." src="http://media.steampowered.com/apps/dota2/posts/LoneDruid_small.jpg" alt="The irony is that he's allergic to fur." width="551" height="223" /></a></p> <p>Community things:</p> <ul> <li><a href="http://www.itsgosu.com/game/dota2/articles/ig-monthly-madness-invitational-finals-mar-29_407" target="_blank">It&#8217;s Gosu&#8217;s Monthly Madness</a> tournament finals are tomorrow, March 29th. You don&#8217;t want to miss this, we hear it could be more than we can bear.</li> <li>Bear witness to <a href="http://www.team-dignitas.net/articles/blogs/DotA/1092/Dota-2-Ultimate-Guide-to-Warding/" target="_blank">Team Dignitas&#8217; Ultimate Guide to Warding</a>. This should be required teaching in clawsrooms across the globe.</li> <li>Great Explorer Nullf has <a href="http://nullf.deviantart.com/#/d4ubxiu" target="_blank">compiled the eating habits</a> of the legendary Tidehunter in one handy chart. This might give you paws before deciding to head to the beach.</li> </ul> <p>Bear in mind that there will not be an update next week as we will be hibernating during that time.</p> <p>Today&#8217;s bearlog is available <a href="http://store.steampowered.com/news/7662" target="_blank">here</a>.</p> <p>&nbsp;</p> <p>Bear.</p>
]]>
</content:encoded>

我只需要 &lt;img src="http://media.steampowered.com/apps/dota2/posts/LoneDruid_small.jpg" /&gt; 所以我可以使用 URL 在我的阅读器应用中显示图像。

我听说有人说不要使用正则表达式,因为它是解析 HTML 的坏习惯。我将其创建为概念证明,无需担心。我正在寻找获取该图像 URL 的最快方法,然后在我的应用程序中调用它。

有人帮忙吗? 提前致谢, 汤姆

【问题讨论】:

标签: c# xml regex windows cdata


【解决方案1】:

准备好使用时可以试试这个HtmlAgilityPack

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(yourstring);
var imgLinks = doc.DocumentNode
    .Descendants("img")
    .Select(n => n.Attributes["src"].Value)
    .ToArray();

【讨论】:

    【解决方案2】:
    const string pattern = @"<img.+?src.*?\=.*?""(<?URL>.*?)""";
    Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
    var match = regex.Match(myCDataText);
    var domain = match.Groups["URL"].Value;
    

    【讨论】:

      【解决方案3】:

      假设您的 xml 看起来像这样(我确定不是),并且这些扩展名:http://searisen.com/xmllib/extensions.wiki

      <?xml version="1.0" encoding="utf-8"?>
      <root xmlns:content='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'>
        <content:encoded>
          <![CDATA[
      <p>We celebrate ...</p> 
      <p>
        <a href="http://media.steampowered.com/apps/dota2/posts/LoneDruid_full.jpg ">
          <img class="alignnone" title="The irony is that he's allergic to fur." 
              src="http://media.steampowered.com/apps/dota2/posts/LoneDruid_small.jpg" />
        </a>
      </p> 
      <p>the rest removed</p> 
      ]]>
        </content:encoded>
      </root>
      

      这将从第二段获取图像源 - 硬编码且丑陋,但这就是你所说的一切。您必须提供path/to/content:encoded 的路径才能使其工作,如果它在一个组(也称为数组)中,那么它会更加复杂。从我的代码中,您可以看到如何分离出数组(参见 paras):

      XElement root = XElement.Load(file) // or .Parse(string)
      string html = root.Get("content:encoded", string.Empty).Replace("&nbsp", " ");
      XElement xdata = XElement.Parse(string.Format("<root>{0}</root>", html));
      XElement[] paras = xdata.GetElements("p").ToArray();
      string src = paras[1].Get("a/img/src", string.Empty);
      

      PS 这是可行的,因为 HTML 格式正确,如果不是,那么您将不得不像其他人回答的那样使用 HtmlAgilityPack。你可以使用Get("content:emcoded" ...)返回的html

      【讨论】:

        猜你喜欢
        • 2020-03-11
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2016-04-09
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多