Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Gokuman en 24 Marzo 2015, 23:49 pm



Título: Extraer datos de CDATA de un archivo XML en C#
Publicado por: Gokuman en 24 Marzo 2015, 23:49 pm
Hola amigos ando algo perdido, tengo un archivo XML donde necesito extraer datos que se encuentran entre etiquetas que a la vez estan dentro un CDATA no se como manejarlo, lo intente con el XPATH pero me extrae toda la cadena del CDATA mas no la etiquetas que quiero

Supongamos tengo este XML y quiero sacar lo que esta entre las etiquetas ambiente, razonSocial y descripción

Ejemplo
Código
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <autorizacion>
  3. <estado>AUTORIZADO</estado><numeroAutorizacion>1703201515411617921521270013730687438</numeroAutorizacion>
  4. <fechaAutorizacion>2015-03-17T15:41:16.486-05:00</fechaAutorizacion>
  5. <comprobante>
  6. <![CDATA[<?xml version="1.0" encoding="UTF-8"?>
  7. <factura id="comprobante" version="1.0.0">
  8. <infoTributaria>
  9. <ambiente>2</ambiente>
  10. <tipoEmision>1</tipoEmision>
  11. <razonSocial>UNNOCYCLES CIA. LTDA.</razonSocial><nombreComercial>UNNOCYCLES CIA. LTDA.</nombreComercial>
  12. <ruc>1792152127001</ruc>
  13. <detalles><detalle><codigoPrincipal>5132</codigoPrincipal><codigoAuxiliar>FX150FM-BLA</codigoAuxiliar><descripcion> MOTO  FX 150  FORTE BLANCO  MOTOR UNO</descripcion><cantidad>2</cantidad><precioUnitario>1887.11</precioUnitario><descuento>1889.76</descuento><precioTotalSinImpuesto>1884.46</precioTotalSinImpuesto><impuestos><impuesto><codigo>2</codigo><codigoPorcentaje>2</codigoPorcentaje><tarifa>12.00</tarifa><baseImponible>1884.46</baseImponible><valor>226.14</valor></impuesto></impuestos></detalle></detalles>]></comprobante></autorizacion>


Título: Re: Extraer datos de CDATA de un archivo XML en C#
Publicado por: Eleкtro en 25 Marzo 2015, 00:44 am
Buenas!

Para empezar, hay algunos errores en ese documento XML cómo para poder parsearlo.

1. El CDATA de tu documento XML lo tienes mal cerrado en </detalles>]> sería así: </detalles>]]>

2. Los elementos <infoTributaria> y <factura> no los cierras en la expresión literal.

Una vez hayas corregido esos fallos ...y de paso no te vendría nada mal formatear/indentar el código para hacerlo minimanete legible al ojo humano y así además evitar en el futuro ese tipo de errores que he mencionado,
te quedaía más o menos un documento así:

Código
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <autorizacion>
  3. <estado>AUTORIZADO</estado>
  4. <numeroAutorizacion>1703201515411617921521270013730687438</numeroAutorizacion>
  5. <fechaAutorizacion>2015-03-17T15:41:16.486-05:00</fechaAutorizacion>
  6. <comprobante>
  7. <![CDATA[
  8. <?xml version="1.0" encoding="UTF-8"?>
  9. <factura id="comprobante" version="1.0.0">
  10. <infoTributaria>
  11. <ambiente>2</ambiente>
  12. <tipoEmision>1</tipoEmision>
  13. <razonSocial>UNNOCYCLES CIA. LTDA.</razonSocial>
  14. <nombreComercial>UNNOCYCLES CIA. LTDA.</nombreComercial>
  15. <ruc>1792152127001</ruc>
  16. <detalles>
  17. <detalle>
  18. <codigoPrincipal>5132</codigoPrincipal>
  19. <codigoAuxiliar>FX150FM-BLA</codigoAuxiliar>
  20. <descripcion> MOTO  FX 150  FORTE BLANCO  MOTOR UNO</descripcion>
  21. <cantidad>2</cantidad>
  22. <precioUnitario>1887.11</precioUnitario>
  23. <descuento>1889.76</descuento>
  24. <precioTotalSinImpuesto>1884.46</precioTotalSinImpuesto>
  25. <impuestos>
  26. <impuesto>
  27. <codigo>2</codigo>
  28. <codigoPorcentaje>2</codigoPorcentaje>
  29. <tarifa>12.00</tarifa>
  30. <baseImponible>1884.46</baseImponible>
  31. <valor>226.14</valor>
  32. </impuesto>
  33. </impuestos>
  34. </detalle>
  35. </detalles>
  36. </infoTributaria>
  37. </factura>
  38. ]]>
  39. </comprobante>
  40. </autorizacion>

Ahora, solo debes cargar el documento corregido, y cargar la expresión literal cómo si fuese un documento XML adicional, y ya podrás parsear sus nodos/elementos cómo en este ejemplo:

Código
  1.        ' Valor literal.
  2.        Dim cdataValue As String = XDocument.Load("C:\Doc.xml").
  3.                                   <autorizacion>.<comprobante>.First.Value.
  4.                                   Trim({" "c, ControlChars.Lf, ControlChars.Tab})
  5.  
  6.        ' Documento XML desde un valor literal.
  7.        Dim xDoc As XDocument = XDocument.Parse(cdataValue)
  8.  
  9.        Dim sb As New System.Text.StringBuilder
  10.        With sb
  11.            .AppendFormat("Ambiente....: {0}", xDoc.<factura>.<infoTributaria>.<ambiente>.Value)
  12.            .AppendLine()
  13.  
  14.            .AppendFormat("Razón.Social: {0}", xDoc.<factura>.<infoTributaria>.<razonSocial>.Value)
  15.            .AppendLine()
  16.  
  17.            .AppendFormat("Descripción.: {0}", xDoc.<factura>.<infoTributaria>.<detalles>.<detalle>.<descripcion>.Value.Trim(" "c))
  18.        End With
  19.  
  20.        Trace.WriteLine(sb.ToString)

Saludos


Título: Re: Extraer datos de CDATA de un archivo XML en C#
Publicado por: Gokuman en 27 Marzo 2015, 03:37 am
Bueno el XML lo copie de otro que es muchísimo mas grande solo como ejemplo no me percate de las etiquetas  :silbar: en todo caso gracias me ayudaste a comprender mejor como trabajar con esto