我可以使用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应用程序中编译的。
答案 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();