2015-03-02 37 views
0

我能够使用C#检索数据XPath并将其显示在列表中,但我想知道如何执行两个独特的操作。将条件语句添加到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”节点,我都可以请求返回空值或它被忽略?我需要这样做,因为我使用的一些页面包含我想要的其他节点中的数据(我无法控制这个),并且如果其中一个节点不包含在内,我不希望应用程序崩溃页。其次,如果节点中不包含任何文本,我是否可以强制输出,即在“ex1”节点的列表中,某些节点包含过期日期,但一个“ex1”节点不包含任何日期,因为它没有任何日期, t过期了。如果发生这种情况,我可以返回自己的'未过期'的价值,例如?

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

回答

1

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

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

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

更新所提供的代码示例INTEGRATING

这应该你的循环内工作。

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(); 
+0

我不知道如何将这个并入我自己的代码中,而无需重写整个事情。我没有设置自己的字符串,这是你在你的例子中似乎已经完成的。但是,您已经强调了我希望实现的最终目标。 – 2015-03-02 14:33:28

+0

没问题 - 我添加了一个如何在示例代码中使用的快速代码示例。 – 2015-03-02 14:43:19

+0

谢谢杰森,完美的作品。 – 2015-03-02 14:55:58