2017-03-20 8 views
0

ラベルにアクセスしようとすると例外をスローするC#WPFフォームで次のコードを使用しています[0] ]。mscorlib.dllの例外 'System.ArgumentOutOfRangeException'をスローするdoc.DocumentNode.SelectSingleNodeでリストのリストを設定する

List<List<string>> labels = doc.DocumentNode.SelectSingleNode("//table[@id='prod-att-table']") 
          .Descendants("tr")         
          .Select(tr => tr.Elements("th").Select(th => th.InnerText.Trim()).ToList()) 
          .ToList(); 

私が働いていますhtmlページでは、このDigi-Keyのページです:私は実現

http://www.digikey.com/product-detail/en/yageo/RC0402JR-0710KL/311-10KJRTR-ND/726418は、ページのソースコードを見てみると、そのテーブル「のid = 'PROD-ATT-表の3番目の「TR」の子孫"残りのような" th "要素は実際にはありません。私が抱えている問題は、labels [2] [0]に例外をスローしないようにする方法を理解できないことです。私のコードに、このヌル要素をスキップしてリストに追加しない方法がありますか?空の文字列 ""でこれらのnullを置き換えることができますか?

答えて

2

あなたがnullのエントリを避けたい場合は、次のコードを使用することができます

var list = doc.DocumentNode.SelectSingleNode("//table[@id='prod-att-table']") 
       .Descendants("tr") 
       .Where(x=>x.Elements("th") != null && x.Elements("th").Count() != 0) //new Code 
       .Select(tr => tr.Elements("th").Select(th => th.InnerText.Trim()).ToList()) 
          .ToList(); 

(少なくともあなたが提供するリンク上)のアイテムを取得するためのより良い方法、このようになります:

var table = doc.DocumentNode.SelectSingleNode("//table[@id='prod-att-table']"); 
var nodes = table.SelectNodes(table.XPath + "//th").Select(x => x.InnerText.Trim()).ToList(); 

ただし、List<List<string>>の代わりにList<string>が表示されます。これが意図されているかどうかはわかりません。

関連する問題