2016-07-10 10 views
0

特定の子ノードをテキストボックスに読み込む必要がありますが、親ノード内に子ノードとして構成されています。C#XML子ノードをテキストボックスにロード

XML構造:XMLSインサイド

<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"> 
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> 
      <det nItem="1"> 
       <prod> 
        <cProd>09</cProd> 
        <cEAN /> 
        <xProd>CHAPEU DE PALHA SOBRAL</xProd> 
       </prod> 
       <imposto> 
        <vTotTrib>30.23</vTotTrib> 
        <ICMS> 
         <ICMSSN101> 
          <orig>0</orig> 
          <CSOSN>101</CSOSN> 
          <pCredSN>2.5600</pCredSN> 
          <vCredICMSSN>2.46</vCredICMSSN> 
         </ICMSSN101> 
        </ICMS> 
       </imposto> 
      </det> 
    </protNFe> 
</nfeProc> 

は、さまざまなノードが存在します。それぞれの場合、いくつかのデータをロードする必要があります。私のコードは、これまでのところです:

   XmlNodeList xndet = xml.GetElementsByTagName("det"); 
       foreach (XmlNode xn in xndet) 

       { 
        string cProd = xn.SelectSingleNode("/prod/cProd").InnerText.ToString(); 
        txCPROD.Text = cProd; 

        string vCredICMSSN = xn.SelectSingleNode("/imposto/ICMS/ICMSSN101/vCredICMSSN").InnerText.ToString(); 
        txICMSSN.Text = vCredICMSSN; 

        // do other things... 

       } 

エラーが発生し、ここで:

"string cProd = xn.SelectSingleNode("/prod/cProd").InnerText.ToString(); 

私のロジックがxnノード内の文字列がcProd要素の内部テキストを受け取ることを言います。

しかし、私はタイプの未処理の例外「System.NullReferenceException」の

+0

なぜあなたはあなたが必要とするすべては一つのノードであるときのforeachを使用して、すべてのノード上で実行されていますか? –

+0

さまざまなノードがあります...私は例を減らすために1つだけ置いています。 –

+0

名前空間を指定します。 –

答えて

1

あなたのXMLが無効で発生した、<NFe>の終了タグが</protNFe>あるので、私はあなたがそうでなければ、あなたのコードではないだろうコピー/ペーストエラーをした推測を取得まったく実行する。

私はSystem.XmlクラスよりもSystem.Xml.Linq.XDocumentが好きです。私はそれを扱う方が簡単です。

ここでは、cProd要素にある値のリストを取得する方法を示します。ここでは、要素のName.LocalNameプロパティを使用して名前空間を無視しています。名前空間を気にする必要がないと確信している場合にのみ、これを実行してください。あなたのサンプルXMLに基づいて、同じ名前ではなく、私が見ることができる別の名前空間に他の要素がないので、私はあなたが必要とは思わない。

string theXML = @"<nfeProc versao=""3.10"" xmlns=""http://www.portalfiscal.inf.br/nfe""><NFe xmlns=""http://www.portalfiscal.inf.br/nfe""><det nItem=""1""><prod><cProd>09</cProd><cEAN /><xProd>CHAPEU DE PALHA SOBRAL</xProd></prod><imposto><vTotTrib>30.23</vTotTrib><ICMS><ICMSSN101><orig>0</orig><CSOSN>101</CSOSN><pCredSN>2.5600</pCredSN><vCredICMSSN>2.46</vCredICMSSN></ICMSSN101></ICMS></imposto></det><det nItem=""2""><prod><cProd>10</cProd><cEAN /><xProd>CHAPEU DE PALHA SOBRAL</xProd></prod><imposto><vTotTrib>30.23</vTotTrib><ICMS><ICMSSN101><orig>0</orig><CSOSN>101</CSOSN><pCredSN>2.5600</pCredSN><vCredICMSSN>2.46</vCredICMSSN></ICMSSN101></ICMS></imposto></det></NFe></nfeProc>"; 
XDocument doc = XDocument.Parse(theXML); 
var cProdNodes = doc.Descendants().Elements().Where (d => d.Name.LocalName == "cProd"); 
List<string> cProdValues = cProdNodes.Select (pn => pn.Value).ToList(); 

名前空間と、それは安全で再生したい場合は、あなたがこれを行うことができます:

XDocument doc = XDocument.Parse(theXML); 
XNamespace ns = "http://www.portalfiscal.inf.br/nfe"; 
var cProdNodes = doc.Descendants().Elements().Where (d => d.Name == ns + "cProd"); 
List<string> cProdValues = cProdNodes.Select (pn => pn.Value).ToList();