2013-06-05 2 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> 

Мне нужно, чтобы получить текст, который находится внутри (что длинные строки)

Вот как я начинаю с # код

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

Я должен был оставить ваш «, xnm» внутри вызова SelectSingleNode; редактирование ответа – 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"> 

Fix, что и вы будете в состоянии использовать что-то вроде этого:

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