我正在运行一个代码,我正在读取一个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。