即使找到 nullException,也继续运行代码



我正在运行一个代码,我正在读取一个XML文件并使用 vb.net 将其保存在局部变量中。

可悲的是,并非所有的XML都是相同的结构,因此我遇到了一个问题,即如果我尝试映射的其中一个字段丢失,它将停止运行代码并提示错误。

我希望,如果一个字段不是资金,请将其保留为 null 并运行代码直到最后。

我尝试使用尝试和捕捉,但没有运气。

Var1 = xmlNode.SelectSingleNode("Test1").InnerText
Var2 = xmlNode.SelectSingleNode("Test2").Value
Var3 = xmlNode.SelectSingleNode("Test3").InnerText

现在,如果其中一个 xml 上缺少 Var2,它将停止运行代码,即使存在也不会采用 Var3。

谢谢

> 如果您使用的是 Visual Studio 2015,则可以使用 null 传播运算符?

Var1 = xmlNode?.SelectSingleNode("Test1")?.InnerText
Var2 = xmlNode?.SelectSingleNode("Test2")?.Value
Var3 = xmlNode?.SelectSingleNode("Test3")?.InnerText

如果您使用的是较旧的东西,那么您将不得不做这只长手:

If xmlNode IsNot Nothing Then 
    Dim node = xmlNode.SelectSingleNode("Test1")
    If node IsNot Nothing then Var1 = node.InnerText
    node = xmlNode.SelectSingleNode("Test2")
    If node IsNot Nothing then Var1 = node.Value
    'etc.
End If

请注意,您可以使用Try...Catch执行此操作,但这将是丑陋的代码:

Try
    Var1 = xmlNode.SelectSingleNode("Test1").InnerText
Catch ex As Exception
     'ignore
End Try
Try
    Var2 = xmlNode.SelectSingleNode("Test2").Value
Catch ex As Exception
     'ignore
End Try
Try
    Var3 = xmlNode.SelectSingleNode("Test3").InnerText
Catch ex As Exception
     'ignore
End Try

因此,如果你有很多这样的,你最好把它包装在一个函数中:

Public Shared Function GetNodeInnerText(node as XmlNode, nodeName As String) As String
    If node Is Nothing Then Return ""
    Dim singleNode = node.SelectSingleValue(nodeName)
    If singleNode Is Nothing Then Return ""
    Return singleNode.InnerText
End Function

您可以使用 nuget 包 Monads.net.来获取 monad "Maybe"。使用它:

var1 = xmlNode.SelectSingleNode("Test1").With(Function(c) c.InnerText)

它在内部检查节点是否为空,如果不是,则返回 InnerText,在另一种情况下返回 null。

相关内容

  • 没有找到相关文章

最新更新