2013-06-05 1 views
0

je le fichier XML suivantComment obtenir InnerText dans un 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> 

Je dois obtenir le texte qui est à l'intérieur (cette longue chaîne)

Voilà comment je commence le code 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"); 

J'ai essayé de diverses manières ...

//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; 

ces 3 façons toujours jeter une exception ...

je trouve une autre façon qui ne jette pas une exception, mais il ne reçoit pas la chaîne

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

Qu'est-ce que je fais mal? ou est-il une autre façon que je peux obtenir la chaîne à l'intérieur

+0

Je suis confus. Votre XML déclare le préfixe de l'espace de noms 'ener' comme un espace de noms vide, mais votre mapping indique autre chose. En outre, le mappage a l'espace de noms 'Documento', mais il n'y a aucune trace de cela dans votre document. – svick

Répondre

1

Je trouve Linq2Xml plus facile à utiliser. (En supposant que vous avez un espace de noms valide dans 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

Votre deuxième tentative semble le plus proche de ce qui devrait fonctionner:

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

Mais passer à ce (édité):

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

renvoie l'exception suivante Namespace Manager ou XsltContext nécessaire. Cette requête a un préfixe, une variable ou une fonction définie par l'utilisateur. – Victor

+0

J'aurais dû laisser votre ", xnm" dans l'appel SelectSingleNode; Editer la réponse – panhandel

+0

Je devrais aussi noter que j'ai dû modifier le fichier xml pour inclure la déclaration xmlns: ener comme d'autres ont également mentionné être nécessaire. – panhandel

1

Ceci est quelque peu simplifiée, et vous aurez besoin pour traiter les problèmes d'espace de noms (un je note ci-dessous), mais sinon, c'est la construction de base:

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

Il y a un problème avec <ener:EstadoDeCuentaCombustible xmlns:ener=""> car l'espace de noms vide n'est pas valide.

1

Vous êtes absent déclaration xmlns:ener sur votre document XML:

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

Fix et que vous serez en mesure d'utiliser quelque chose comme ceci:

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