我正在使用以下代码解析以下 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 类中没有任何元素。
最佳答案
将处理分为三个步骤。
- 选择“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 集合的信息)。
编辑: 完整代码示例后答案得到澄清。
关于c# - 防止引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22908283/