2016-06-07 3 views
2

Я запускаю код, где я читаю XML-файл и сохраняю его в локальных переменных с помощью vb.net.Продолжайте работать, даже если найдено nullException

К сожалению, не все XML одинаково структурированы, поэтому я решаю проблему, что если одно поле тех, что я пытаюсь сопоставить, отсутствует, оно прекратит выполнение кода и предложит ошибку.

Я хотел бы, если поле не является фондом, сохраните его как null и пробежит код до конца.

Я попытался использовать попытку и уловить, не повезло.

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

Теперь, если Переменная2 отсутствует на одном из XML, он будет остановить выполнение кода и не принимать var3 даже если они присутствуют.

Спасибо

+0

не Можете ли вы разделить заявление на 'NODE2 = xmlNode.SelectSingleNode («test2»)', а затем проверить на Нуль перед выполнением 'Var2 = Node2.Value'? –

+0

Интересно, что посмотрю спасибо, но потом он потерпит крах на линии Node2, я верю и сделаю код намного более грязным. –

ответ

3

Если вы используете Visual Studio 2015 вы можете использовать оператор нулевых распространяющейся ?

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 
+0

Здравствуйте, К сожалению, я использую 2010, так что это не сработает. –

+0

Здравствуйте, Да, это работает, спасибо, но у меня есть 50+ узлов для анализа, хотелось бы, чтобы был другой способ. –

+1

Хорошо, сделал последний вариант, который вы мне дали и работали в качестве очарования! Большое спасибо! –

0

Вы можете использовать NuGet пакет Monads.net. получить монаду «Может быть». Использование:

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

это внутри убедитесь, что узел не является нулевым, и если это не так, вернуться InnerText, в другом случае возвращение нуля.

Смежные вопросы