2017-11-20 25 views
3

foreach를 사용하여 subdata 및 subdata2 값을 가져 오려고합니다. 그러나 어떤 이유로 든 null 참조 예외가 발생합니다.foreach를 사용하여 XML 값을 가져올 수 없습니다.

XML을 :

<project> 
<name>Name1</name> 
<data> 
    <subdata>1</subdata> 
    <subdata2>1</subdata2> 
</data> 
<data> 
    <subdata>3</subdata> 
    <subdata2>2</subdata2> 
</data> 
</project> 

코드 :

XmlNode datanode = doc.DocumentElement.SelectSingleNode("/project/data"); 
XmlNode innerDataNode; 
foreach (XmlNode dataVar in datanode) 
{ 
    innerDataNode = datanode.SelectSingleNode("/subdata"); 
    int subdataVal = XmlConvert.ToInt16(innerDataNode.InnerText); 
    //(...) 
} 

예외 :

System.NullReferenceException : 개체의 인스턴스로 설정되지 않았습니다 '개체 참조. innerDataNode가 null입니다.

내가 뭘 잘못하고 있니?

답변

5

노드의 현재 컨텍스트에서 검색하지 않습니다. 차이점은 점입니다. 그래서

innerDataNode = datanode.SelectSingleNode("/subdata"); 

은 다음과 같아야합니다

innerDataNode = datanode.SelectSingleNode("./subdata"); 

그것은 작은 실수 우리가 많이 발생합니다.

XmlNode datanode = doc.DocumentElement.SelectSingleNode("/project/data"); 

만 당신에게 ONE 데이터 노드를 제공하고 당신은 모든 데이터 노드를 원하는 코드의 나머지 부분에 의해 판단 :하지만 그 유일한 실수하지 않는 것 같습니다.

XmlNodeList datanodes = doc.DocumentElement.SelectNodes("/project/data"); 

는 이제 foreach 루프가 정확했지만, 대신 당신을 통해 루프를 가정하고있는 변수 (dataVar)의 데이터 노드를 선택 유지 : 그래서 당신은이 작업을 수행 할 수 있습니다.

XmlNode innerDataNode; 
foreach (XmlNode dataVar in datanodes) 
{ 
    innerDataNode = dataVar.SelectSingleNode("./subdata"); 
    Console.WriteLine(innerDataNode.InnerText); 
}