2016-07-10 2 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'는

발생 귀하의 XML이 유효하지
+0

왜 당신은 당신이 필요로하는 모든이 하나 개의 노드 때 foreach 문을 사용하여 모든 노드에서 실행중인? –

+0

다양한 노드가 있습니다 ... 예제를 줄이기 위해 하나만 넣었습니다. –

+0

네임 스페이스를 지정하십시오. –

답변

1

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