2

以下のコードを使用して、次の html を解析しています。

 var exroom = (from roomItem in
           doc.DocumentNode.SelectNodes("//div[@class='dias']//h2")

       from s  in roomItem.NextSibling.NextSibling.SelectNodes(".//label")

       let rName = roomItem.InnerText.CleanInnerText()

       select new
       {
           roomID = rName,
           Pers = 2,
           Currency = "EUR",
           rateName = s.InnerText.CleanInnerText(),
           roomName = rName,
           Price = PriceHelper.Convert(PriceRegEx.Match(s.Attributes["precio"].Value.CleanInnerText()).Groups["price"].Value)
       }
).ToArray();

しかし、上記のタグなしで html コンテンツを解析すると、例外が発生します。解析中に例外が発生するのを防ぎ、 exroom 配列に対して 0 を返すにはどうすればよいですか? クラスdiasに要素がありません。

4

2 に答える 2

1

処理を 3 つのステップに分割します。

  • クラス「dias」の要素を選択
  • 選択した変数をチェックし、null 以外の場合にのみ処理を続行します
  • 残りの処理

exroom 変数に匿名型オブジェクトの配列があるため、空の配列を作成するのは難しい場合があります。

その型をいくつかのクラスにラップすることをお勧めします。

public class RoomItem {
    public string roomID { get; set; }
    public string Pers { get; set; }
    ...
}

次に、exroom 変数を選択すると、次のようになります。

var diasElements = doc.DocumentNode.SelectNodes("//div[@class='dias']//h2");
var exroom = new RoomItem[] { };
if(null != diasElements) { 
    exroom = (from roomItem in diasElements
    from s in roomItem.NextSibling.NextSibling.SelectNodes(".//label")
    let rName = roomItem.InnerText.CleanInnerText()
    select new RoomItem
    {
         roomID = rName,
         Pers = 2,
         Currency = "EUR",
         rateName = s.InnerText.CleanInnerText(),
         roomName = rName,
         Price =
              PriceHelper.Convert(
                  PriceRegEx.Match(s.Attributes["precio"].Value.CleanInnerText()).Groups["price"].Value)
              }
    ).ToArray()
}

サンプルコードから、クラス「dias」を持つ要素の空のリストは、何らかの形式のエラーメッセージを返すように見えます(例外をスロー/キャッチするか、BookingEngineResponseを空のdiasコレクションに関する情報を渡すように適応させます)。

編集:完全なコードサンプルの後に回答が明確になりました。

于 2014-04-07T09:44:24.697 に答える