2014-01-22 2 views
0

XML 파일의 특정 요소를 표시하기 위해 btnUpdate를 누르면 존재하는 요소가 먼저 표시되지만 더 이상 존재하지 않으면 "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 

여기에 당신이 참조의 속성 또는 메서드를 호출하는 경우 발생합니다

<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 ("개체 참조가 개체의 인스턴스로 설정되지 않았습니다.") 내 xml 파일입니다 Nothing 값 (C#에서는 null)을가집니다. 귀하의 경우, 귀하의 Data 컬렉션에 찾고있는 자녀가없는 요소가 포함되어있을 가능성이 큽니다.

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과 그 답변에 제공됩니다 :이 문제를 해결하기 위해, For Each 루프의 코드를 변경합니다.

구체적인 예로는 Person 요소에만 관심이있는 것 같습니다.

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

변수가 많으면 짧은 문장이 있습니까? – EmPlusPlus

+1

@EmPlusPlus : 가장 좋은 방법은 지나치게 가변적이지 않은 XML 형식을 사용하는 것입니다. 적은 옵션, 적은 IF 문. 필자는'Person' 엘리먼트를 필터링 할 수있는'Descendants' 메쏘드로 이미 그 대답을 업데이트했습니다. 모든 Person 요소에 특정 하위 요소가 있다고 확신하는 경우이 하위 요소에 대한 변수 나 Nothing에 대한 검사가 필요하지 않습니다. – Markus

3

문제는 이름은 XML의 자식 요소가 포함되어 있습니다 : 모든 Person 요소가 필요한 아이들이 있는지 확인하는 경우 당신은 또한 단지 이러한 요소를 받아 어쩌면 아무것도에 대한 검사를 생략 할 자손을 필터링 할 수 있습니다 로드 한 문서 -이 경우에는 .... (즉, 모든 이름 태그와 그 자식). 당신이 원하는 무엇

모든 노드와 노드의 컬렉션을 잡아, 당신은이 방법을 수행 할 수 있습니다

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 
관련 문제