2013-06-05 4 views
0

I가 다음과 같은 XML 파일는 XML에서 innerText와 얻는 방법

<?xml version="1.0" encoding="utf-8"?> 
<Comprobante version="2.2" serie="A" folio="35207" fecha="2013-05-31T11:51:48"> 
<Emisor rfc="" nombre="E"> 
    <DomicilioFiscal calle="" noExterior="" colonia="" /> 
    <ExpedidoEn calle="" noExterior="" colonia="" /> 
    <RegimenFiscal Regimen="Regimen" /> 
</Emisor> 

<Receptor rfc="" nombre="Z"> 
    <Domicilio calle="" noExterior="" colonia="" /> 
</Receptor> 

<Conceptos cantidad="1.000" unidad="COMISION" descripcion="PENDIENTE" valorUnitario="28.50000" importe="28.50" /> 

<Impuestos totalImpuestosTrasladados="3.14"> 
    <Traslados> 
    <Traslado impuesto="IVA" tasa="11.00" importe="3.14" /> 
    </Traslados> 
</Impuestos> 

<Addenda> 
    <ener:EstadoDeCuentaCombustible xmlns:ener=""> 
    <ener:cadenaOriginal>||2.2|A|35207|2013-05-31T11:51:48|773463|2011|ingreso|Pago en una sola exhibicion|28.50|31.64|Tarjeta|Tijuana,Baja California|3213|ERE|E S.A. de C.V.|Prol|13351|Anexa e|Tijuana|Tijuana|Baja California|Mexico|22100|Prol|13351|Anexa e|Tijuana|Tijuana|Baja California|Mexico|22100|Regimen|XA|Z||||TIJUANA|TIJUANA|BAJA CALIFORNIA|Mexico||1.000|COMISION|PENDIENTE|28.50000|28.50|IVA|11.00|3.14|3.14||</ener:cadenaOriginal> 
    <ener:idRefund>98</ener:idRefund> 
    </ener:EstadoDeCuentaCombustible> 
</Addenda> 
</Comprobante> 
내가 C# 코드를 시작하는 방법

다음

가의 내부에있는 텍스트 (즉, 긴 문자열)를 얻을 필요가

XmlDocument doc = new XmlDocument(); 
doc.Load("Route"); 

XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable); 

xnm.AddNamespace("Documento", "http://www.sat.gob.mx/cfd/2"); 
xnm.AddNamespace("ener", "http://www.enercard.com.mx/cfd"); 

나는 여러 가지 방법을 시도했습니다 ...

//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda", xnm).FirstChild.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText; 
//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda//ener:EstadoDeCuentaCombustible", xnm).FirstChild.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText; 
//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda/Documento:cadenaOriginal", xnm).InnerXml; 

이 3 가지 방법은 항상

내가 예외가 발생하지 않는 다른 방법을 발견 ... 예외를 발생하지만, 문자열 내가 잘못 뭐하는 거지

XmlElement root = doc.DocumentElement; 
XmlNodeList nodes = root.SelectNodes("/Addenda/EstadoDeCuentaCombustible"); 
strOriginalString = ""; 

foreach (XmlNode node in nodes) 
{ 
    XmlNode child = node.SelectSingleNode("./cadenaOriginal"); 

    if (child != null) 
    { 
     strOriginalString = child.InnerText; 
     break; 
    } 
} 

을하지 않습니다? 또는 문자열을 얻을 수있는 다른 방법이 있습니다

+0

내가 혼란 스러워요. XML은'ener' 네임 스페이스 접두사를 빈 네임 스페이스로 선언하지만 매핑은 다른 것을 말합니다. 또한, 매핑은'Documento' 네임 스페이스를 갖습니다. 그러나 문서에서 그것의 흔적은 없습니다. – svick

답변

1

Linq2Xml을 사용하기가 더 쉽습니다. (유효한 네임 스페이스가 xmlns:ener="" 인 것으로 가정).

var xDoc = XDocument.Load(filename); 
XNamespace ener = "your name space for ex ,http://www.enercard.com.mx/cfd"; 
var result = xDoc.Descendants(ener + "cadenaOriginal").First().Value; 
1

두 번째 시도가 작동해야하는지에 가장 가까운 모습이에

//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda//ener:EstadoDeCuentaCombustible", xnm).FirstChild.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText; 

그러나 전환 (편집) :

//strOriginalString = doc.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText; 
+0

은 다음 예외를 throw합니다. 네임 스페이스 관리자 또는 XsltContext가 필요합니다. 이 쿼리에는 접두사, 변수 또는 사용자 정의 함수가 있습니다. – Victor

+0

SelectSingleNode 호출 안에 "xnm"을 두었어야합니다. 편집 대답 – panhandel

+0

다른 사람도 필요하다고 언급 한 것처럼 xmlns : ener 선언을 포함하도록 XML 파일을 편집해야한다는 것에 유의해야합니다. – panhandel

1

이 다소 단순화하고, 당신이 필요합니다 네임 스페이스 문제 (아래에서 설명) 중 하나를 다룰 수 있지만, 그렇지 않은 경우 기본 구조가됩니다.

 XmlDocument doc = new XmlDocument(); 
     try { doc.Load("c:\\temp\\test.xml"); } 
     catch (Exception ex) { } 
     XmlElement root = doc.DocumentElement; 
     String strOriginalString = ""; 

     foreach (XmlNode node in root.SelectNodes("/Comprobante/Addenda")) 
     { 
      XmlNode child = node.SelectSingleNode("EstadoDeCuentaCombustible/cadenaOriginal"); 
      if (child != null) 
      { 
       strOriginalString = child.InnerText; 
       break; 
      } 
     } 

빈 네임 스페이스가 유효하지 않으므로 <ener:EstadoDeCuentaCombustible xmlns:ener="">에 문제가 있습니다.

<ener:EstadoDeCuentaCombustible xmlns:ener="http://www.enercard.com.mx/cfd"> 

가를 수정하고이 같은 것을 사용할 수 있습니다 :

1

당신은 당신의 XML 문서에 xmlns:ener 선언을 놓치고

string xpath = "/Comprobante/Addenda/ener:EstadoDeCuentaCombustible"; 
foreach (XmlNode estado in doc.SelectNodes(xpath, xnm)) 
{ 
    Console.WriteLine("ener:cadenaOriginal={0}", 
     estado.SelectSingleNode("ener:cadenaOriginal", xnm).InnerText); 
} 
관련 문제