Validación Xml tipo CFDI contra su XSD en C#

En esta publicación validaremos un CFDI "Comprobante Fiscal Digital por Internet" utilizado en la facturación en México, implementado por el SAT.
Este tipo de XML es sencillo ya que quien este relacionado con este tema sabre que existen muchos nodos y atributos que se pueden implementar en este contexto dependiendo del tipo de comprobante y/o la obligación fiscal con  la que se requiere cumplir.

La estructura de un CFDI la pueden consultar en la documentación oficial proporcionada por el SAT.
Enlace al final de la publicación.

Si aún no estan muy inmersos en el tema de los XML aquí dejo dos enlaces con información muy básica relacionada con:

Figura 1: CFDI 3.3 Ejemplo

Descripción del proceso

El CFDI de la Figura 1 es la estructura de un comprobante de tipo Egreso que contiene los datos básicos para la generación de un comprobante de este tipo. Como podrán observar algunos atributos del nodo cfdi:Comprobante están vacíos para poder representar el ejemplo de esta publicación.

Como saber que archivos XSD se deben utilizar?

Fácil, en la parte superior del comprobante ya sea en los primeros o los ultimo atributos que se muestren deberan estar registrados los namespaces que indican las referencias de estructura que siguen los CFDI.
Nosotros nos enfocamos en: http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd que corresponde con la ubicación donde se encuentra el XSD. Internamente en el archivo XSD se enceuntrar referencias a catálogos que forman parte de la colección de claves definidas por el SAT para representar algunos datos como: Claves de Producto y/o servicio, CP, Formas de pago, Monedas, Tipos de percepciones, Tipos de Deducciones... etc. Y otros XSD contienen información sobre la estructura del comprobante, tipos de datos válidos, patrones de validación (expresiones regulares), y la definición de atributos y/o nodos opcionales y requeridos.

Implementación


El siguiente código dará como resultado una aplicación en consola que lee un CFDI predeterminado e implementa únicamente tres archivos XSD:

  • cfdv33: Definición de estructura del CFDI
  • catCFDI: Colección de catálogos con las claves definidas por el SAT
  • tdCFDI: Definición de expresiones regulares y tipos de datos permitidos.

El primer paso es la lectura del archivo XML, un punto importante aquí es el encoding utilizado para la lectura del XML ya que si pretendes leer algo con caracteres como '&', 'Ñ' o algún otro caracteres especial tendrás que utilizar Encoding UTF8, en la documentación del SAT también encontraras algo de información sobre esto.

Figura 2: Lectura e implementación de la validación.

Segundo paso, configurar la lectura. Los archivos XSD son añadidos a un objeto de tipo XmlReaderSettings a través de un XmlSchemaSet jugando el papel de un contenedor. Un punto importante es el XmlResolver con valor null, si esta línea se ignora el XmlReader intentara resolver los namespaces volviendo LENTA la validación por lo que necesitaras todos los XSD que requiera tu comprobante para poder implementar esta validación.

Figura 3: Método de validación


Finalmente, si la validación encuentra algún error en la estructura sera cachado por alguno de los dos primeros catch devolviendo el mensaje con detalles del error. Si realizas una prueba con el XML ejemplo  de la Figura 1, el error sera referente al atributo cfdi:Comprobante.NoCertificado ya que no tiene la estructura definida por el patrón de datos.


Descarga el ejemplo dando click aquí

Referencias



Entradas más populares de este blog

Lectura de archivos XML - XmlDocument

Cómo leer un certificado X509