向 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();
我能够使用 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();