我从xml读取元素时遇到异常

时间:2014-01-22 08:37:15

标签: xml vb.net nullreferenceexception

当我按btnUpdate显示我的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>a@a.com</Email>
    <Tel>123</Tel>
  </Person>
  <Others>
    <Other_Info>This is NOOOOTTHHIIINNNG</Other_Info>
  </Others>
</Data>

2 个答案:

答案 0 :(得分:3)

问题是Name包含您加载的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

答案 1 :(得分:0)

如果在具有Nothing值的引用上调用属性或方法(C#中为null),则抛出NullReferenceException(“对象引用未设置为对象的实例。”)。在您的情况下,您的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

question及其答案中提供了有关NullReferenceExceptions及其原因的全面概述。

在您的具体示例中,您似乎只对Person元素感兴趣。您还可以过滤后代以仅接收这些元素,如果您确定所有Person元素都具有所需的子元素,则可以省略对Nothing的检查:

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