将条件语句添加到XPath查询

时间:2015-03-02 13:29:46

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

我可以使用C#& amp; XPath并将其显示在列表中,但我想知道如何执行两个独特的操作。

首先,我的代码示例如下所示:

    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        string htmlPagePurchase = "";

        using (var client = new HttpClient())
        {
            htmlPagePurchase = await client.GetStringAsync(MyURI);
        }

        HtmlDocument htmlDocumentPurchase = new HtmlDocument();
        htmlDocumentPurchase.LoadHtml(htmlPagePurchase);

        foreach (var div in htmlDocumentPurchase.DocumentNode.SelectNodes("//div[contains(@id, 'odyContent')]"))
        {
            PurchaseDetails newPurchase = new PurchaseDetails();
            newPurchase.Expiry = div.SelectSingleNode(".//ex1").InnerText.Trim();
            Purchase.Add(newPurchase);
        }
        lstPurchase.ItemsSource = Purchase;
    }

首先,如果没有" ex1"页面中的节点,我可以请求返回空值还是忽略它?我需要这样做,因为我使用的一些页面包含我想要的替代节点中的数据(我无法控制它),如果其中一个节点不是&#,我不希望应用程序崩溃39; t包含在该页面中。

其次,如果节点中不包含任何文本,我可以强制输出,即在" ex1"节点,有些包含过期日期,但有一个" ex1"节点不包含任何日期,因为它还没有过期。如果发生这种情况,我可以返回我自己的“没有过期”的价值吗?

这是在Windows Phone 8.0 Silverlight应用程序中编译的。

1 个答案:

答案 0 :(得分:1)

此代码应该通过检查节点和值来工作,如果没有找到实际值,则使用defaultValue

var node = xmlDoc.SelectSingleNode(".//ex1");
return (node == null || string.IsNullOrEmpty((node.InnerText ?? "").Trim()) ? defaultValue : node.InnerText.Trim());

.NET小提琴:https://dotnetfiddle.net/3DAjKH

与提供的代码示例集成的更新

这应该在你的循环中工作。

var exNode = div.SelectSingleNode(".//ex1");
if (exNode == null || string.IsNullOrEmpty((exNode.InnerText ?? "").Trim()))
    newPurchase.Expiry = "N/A"; // Default value
else
    newPurchase.Expiry = div.SelectSingleNode(".//ex1").InnerText.Trim();