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
<?xml version="1.0" encoding="UTF-8"?>
<autorizacion>
<estado>AUTORIZADO</estado><numeroAutorizacion>1703201515411617921521270013730687438</numeroAutorizacion>
<fechaAutorizacion>2015-03-17T15:41:16.486-05:00</fechaAutorizacion>
<comprobante>
<![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<factura id="comprobante" version="1.0.0">
<infoTributaria>
<ambiente>2</ambiente>
<tipoEmision>1</tipoEmision>
<razonSocial>UNNOCYCLES CIA. LTDA.</razonSocial><nombreComercial>UNNOCYCLES CIA. LTDA.</nombreComercial>
<ruc>1792152127001</ruc>
<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>
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í:
<?xml version="1.0" encoding="UTF-8"?>
<autorizacion>
<estado>AUTORIZADO</estado>
<numeroAutorizacion>1703201515411617921521270013730687438</numeroAutorizacion>
<fechaAutorizacion>2015-03-17T15:41:16.486-05:00</fechaAutorizacion>
<comprobante>
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<factura id="comprobante" version="1.0.0">
<infoTributaria>
<ambiente>2</ambiente>
<tipoEmision>1</tipoEmision>
<razonSocial>UNNOCYCLES CIA. LTDA.</razonSocial>
<nombreComercial>UNNOCYCLES CIA. LTDA.</nombreComercial>
<ruc>1792152127001</ruc>
<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>
</infoTributaria>
</factura>
]]>
</comprobante>
</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:
' Valor literal.
Dim cdataValue As String = XDocument.Load("C:\Doc.xml").
<autorizacion>.<comprobante>.First.Value.
Trim({" "c, ControlChars.Lf, ControlChars.Tab})
' Documento XML desde un valor literal.
Dim xDoc As XDocument = XDocument.Parse(cdataValue)
Dim sb As New System.Text.StringBuilder
With sb
.AppendFormat("Ambiente....: {0}", xDoc.<factura>.<infoTributaria>.<ambiente>.Value)
.AppendLine()
.AppendFormat("Razón.Social: {0}", xDoc.<factura>.<infoTributaria>.<razonSocial>.Value)
.AppendLine()
.AppendFormat("Descripción.: {0}", xDoc.<factura>.<infoTributaria>.<detalles>.<detalle>.<descripcion>.Value.Trim(" "c))
End With
Trace.WriteLine(sb.ToString)
Saludos
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