Windows Phone 8.0 Silverlight App& HTMLAgilityPack处理缺少的元素

时间:2016-03-26 17:59:01

标签: c# xaml windows-phone-8 html-agility-pack

在Windows Phone 8.0 Silverlight应用程序中使用HttpClient和HtmlAgility包。

我想知道如何管理节点/图片不包含在HTML部分中的异常。

例如,这是我从中获取信息的HTML片段。

<PARENT>
    <div class="game-c">
        <div class="boxshot">
            <img class="cover" src="http://cover_source" />
        </div>
        <h3 class="h3 white-c">Game Title ...</h3>
        <p>Game description goes here...</p>
        <p>...</p>
        <div class="cta-signedOut">...</div>
        <div class="cta-signedIn">
            <a href="https://link.to.store"> 
            <img src="gameImage.gif" /></a>
        </div>
    </div>
</PARENT>

我需要来自第三个div(cta-signedIn)的img src。但是,对于某些日期,最后两个div被注释掉了。所以代码看起来像这样:

<PARENT>
    <div class="game-c">
        <div class="boxshot">
            <img class="cover" src="http://cover_source" />
        </div>
        <h3 class="h3 white-c">Game Title ...</h3>
        <p>Game description goes here...</p>
        <p>...</p>
        **<!--<div class="cta-signedOut">...</div>
        <div class="cta-signedIn">
            <a href="https://link.to.store"> 
            <img src="gameImage.gif" /></a>
        </div-->**
    </div>
</PARENT>

理想情况下,当这两个div被注释掉时,我想使用我自己的图像文件,该文件位于/Assets/Images/Unavailable.png

中。

您是否可以确认以下代码可以正确找到信息...

div.SelectSingleNode("//div[3]/a/img").Attributes["src"].Value;

谢谢。

27/03/2016 - 增加了以下内容:

我使用以下代码,但它没有加载本地图片。

我正在尝试以下方法,但它不起作用......

var img = div.SelectSingleNode("div[@class='cta-signedIn']/a/img");
var img2 = ("/Assets/Images/storeLogo_unavailable.png");
if (img == null)
{
    newGame.StoreLink = img2;
}
else
{
    newGame.StoreLink = div.SelectSingleNode("div[@class='cta-signedIn']/a/img").Attributes["src"].Value;
}

此外,由于某种原因,此代码执行速度非常慢。有什么特别的原因吗?

1 个答案:

答案 0 :(得分:0)

如果您只是想检查图像的存在并相应地做一些逻辑,那么您可以检查图像的SelectSingleNode()给定选择器是否返回null。例如,假设div引用HTML代码段中的外部div

var img = div.SelectSingleNode("div[@class='cta-signedIn']/a/img");
if(img != null)
{
    //TODO: do something with `img`
}
else
{
    //TODO: use local image file
}

顺便说一句,我在上面的代码段中建议了一个可能更有意义的选择器。元素位置指数通常意义不大。