2014-01-22 34 views
0

當我按下btnUpdate來顯示XML文件中的特定元素時,它首先顯示存在的元素,但是如果沒有其他元素會顯示異常錯誤,說「Object引用未設置爲對象的實例「。我從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值(C#中爲null)。在你的情況下,你的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 

約NullReferenceException異常及其原因的綜合概述在這個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