2017-11-20 29 views
3

foreachを使用してサブデータとサブデータ2の値を取得しますが、何らかの理由で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); 
} 
関連する問題