2014-01-22 2 views
0

Когда я нажимаю btnUpdate, чтобы отобразить определенные элементы из моего XML-файла, он сначала показывает существующие элементы, но если его больше нет, он покажет мне ошибку исключения, в которой говорится: «Объект ссылка не установлена ​​в экземпляр объекта. "Я получаю исключение, пока я читаю элементы из xml

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 
    Dim xelement As XElement = xelement.Load(cbFileName.Text) 
    Dim Data As IEnumerable(Of XElement) = xelement.Elements() 

    For Each dat In Data 
     MsgBox(dat.Element("Name").Value & "...." & dat.Element("Tel").Value) 'Error is from this part' 
    Next dat 
End Sub 

и вот мой XML файл

<Data> 
    <Person> 
    <Name>Alireza</Name> 
    <Email>[email protected]</Email> 
    <Tel>123</Tel> 
    </Person> 
    <Others> 
    <Other_Info>This is NOOOOTTHHIIINNNG</Other_Info> 
    </Others> 
</Data> 

ответ

0

NullReferenceException («ссылка на объект не указывает на экземпляр объекта.») Генерируется, если вы вызываете свойство или метод по ссылке, что имеет значение Nothing (null в C#). В вашем случае очень вероятно, что ваша коллекция Data содержит элементы, в которых нет детей, которые вы ищете. Для того, чтобы исправить это, изменить код из For Each петли для:

For Each dat In Data 
    Dim elName = dat.Element("Name") 
    Dim elTel = dat.Element("Tel") 
    If elName IsNot Nothing AndAlso elTel IsNot Nothing Then 
     MsgBox(elName.Value & "...." & elTel.Value) 
    End If 
Next dat 

Исчерпывающий обзор о NullReferenceExceptions и его причинах предусмотрены в этом question и его ответах.

В вашем конкретном примере вас, кажется, интересуют только элементы Person. Вы также можете отфильтровать потомок получить только эти элементы и, возможно опустить чек против Ничего, если вы уверены, что все Person элементов имеют необходимые ребенок:

Dim Data As IEnumerable(Of XElement) = xelement.Descendants("Person") 
+0

Что делать, если у меня есть много переменных, есть ли более короткие выражения? – EmPlusPlus

+1

@EmPlusPlus: лучший способ - иметь формат XML, который не является слишком переменным. Малые варианты, меньшие IF-утверждения. Я уже давно обновил ответ с помощью метода 'Descendants', который позволяет фильтровать элементы' Person'. Если вы уверены, что все элементы Person имеют определенные подэлементы, вам не нужна переменная или проверка Nothing для этого подэлемента. – Markus

3

Проблема в том, что имя содержит дочерние элементы XML документ, который вы загрузили - в этом случае, и .... (т. е. все теги имен и их дети).

То, что вы хотите сделать, это взять набор всех узлов и узлов, и вы можете сделать на этом пути:

Dim Names As IEnumerable(Of XElement) = xelement.Descendants("Name") 

For Each Name As XElement In Names 
     MsgBox((Name.Value) 
Next 

То же можно сделать для «Тел»

полный код :

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 

    Dim xelement As XElement = xelement.Load(cbFileName.Text) 

    Dim products As IEnumerable(Of XElement) = xelement.Descendants("Name") 

    For Each product As XElement In products 
     MessageBox.Show(product.Value) 
    Next 

    Dim Telephone As IEnumerable(Of XElement) = xelement.Descendants("Tel") 

    For Each telep As XElement In Telephone 
     MessageBox.Show(telep.Value) 
    Next 

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