当使用HtmlAgilityPack时,我的代码在我可以执行任何类型的检查之前发出错误的错误,例如:
Dim doc = New HtmlDocument()
doc.LoadHtml(sl)
Dim searchId = doc.DocumentNode.SelectSingleNode("//input[@name='searchId']").Attributes("value").Value
点击此行(工作正常后)
Dim searchId = doc.DocumentNode.SelectSingleNode("//input[@name='searchId']").Attributes("value").Value
我得到的对象没有设置为引用,我知道它是因为它没有在html代码中看到这个值,我不确定检查它的最佳方法是&# 39; t为空,所以我可以继续执行,否则应用程序崩溃。
有人可以帮忙吗?
答案 0 :(得分:0)
您的失败行包含多个属性查找,为清晰起见,这里将其分开::
Dim searchId = doc
.DocumentNode
.SelectSingleNode("//input[@name='searchId']")
.Attributes("value")
.Value
如果这些查找中的任何一个(.Value
除外)为空,您将收到您描述的错误。例如,如果没有匹配的@name='searchId'
元素,.Attributes
调用将抛出错误。
为了防止出现错误,您需要在尝试下一次查找之前单独检查每个结果。 doc.DocumentNode
不太可能是Nothing
(假设您的文档有效且正确加载),所以类似这样的内容:
Dim searchId As String
If doc.DocumentNode.SelectSingleNode("//input[@name='searchId']") IsNot Nothing Then
If doc.DocumentNode.SelectSingleNode("//input[@name='searchId']").Attributes("value") IsNot Nothing Then
searchId = singleNode.Attributes("value").Value
End If
End If
您可以使用短路If
运算符缩短代码并阻止嵌套AndAlso
。我还添加了一个临时变量以便于阅读:
Dim searchId As String
Dim idNode = doc.DocumentNode.SelectSingleNode("//input[@name='searchId']")
If idNode IsNot Nothing AndAlso idNode.Attributes("value") IsNot Nothing Then
searchId = idNode.Attributes("value").Value
End If