当我按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>
答案 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")