2013-06-05 25 views
0

我有下面的XML文件如何獲得的innerText在XML

<?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

會引發以下異常 命名空間管理器或XsltContext需要。該查詢具有前綴,變量或用戶定義的函數。 – Victor

+0

我應該在SelectSingleNode調用中留下你的「,xnm」;編輯答案 – panhandel

+0

我還應該注意,我確實必須編輯xml文件以包含xmlns:ener聲明,就像其他人也提到的那樣需要。 – 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="">問題。

1

你錯過xmlns:ener聲明在XML文檔:

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

修復了,你就可以使用這樣的事情:

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); 
}