向 XPath 查询添加条件语句

Adding conditional statements to an XPath query

我能够使用 C# 和 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" 节点,我可以请求空值被 return 编辑或忽略吗?我需要这样做,因为我使用的某些页面包含我想要的备用节点中的数据(我无法控制它),如果其中一个节点不包含在其中,我不希望应用程序崩溃页。

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

正在 Windows Phone 8.0 Silverlight 应用程序中编译。

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

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

.NET Fiddle: 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();