Ver Mensaje Individual
  #4  
Antiguo 23-12-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 599
Reputación: 1
bmfranky Va por buen camino
Vlidacion XML con XSD

Hola os copio un trozoi de codigo semi funcional, valida el contenido, la estructura da informacion aproximada, por lomenos con las pruevas realizadas.
Código:
        /// <summary>
        /// Funcion par acomprobar si el xml es correcto
        /// </summary>
        /// <param name="Xml">Xml a cotejar</param>
        /// <param name="path">Path donde estan los archivos.</param>
        /// <returns></returns>
        public bool checaXml(string Xml,string path= ".\\")
        {
            TextReader Read= new StringReader(Xml);
            var schemas = new XmlSchemaSet();
            Xml = Xml.Replace("<RegFactuSistemaFacturacion xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<RegFactuSistemaFacturacion xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\">");
            //Xml = Xml.Replace(" xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\"", "");
            //Xml = Xml.Replace(" xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd\"", "");
            using (FileStream stream = File.OpenRead(@path + "SuministroInformacion.xsd"))
            {
                var xsdFileR = XmlSchema.Read(stream, (s, e) =>
                {
                    var x = e.Message;
                });
                schemas.Add(xsdFileR);
            }
            using (FileStream stream = File.OpenRead(@path + "SuministroLR.xsd"))
            {
                var xsdFileR = XmlSchema.Read(stream, (s, e) =>
                {
                    var x = e.Message;
                });
                schemas.Add(xsdFileR);
            }
            using (var fs = File.OpenRead(@path + "xmldsig-core-schema.xsd"))
            using (var reader = XmlReader.Create(fs, new XmlReaderSettings()
            {
                DtdProcessing = DtdProcessing.Ignore // important
            }))
            {
                schemas.Add(@"http://www.w3.org/2000/09/xmldsig#", reader);
            }
            bool isvalid = true;
            StringBuilder sb = new StringBuilder();
            try
            {
                
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
            settings.Schemas = schemas;
            settings.ValidationEventHandler += (s, e) =>
            {
                if (e.Severity == XmlSeverityType.Warning)
                {
                    sb.AppendLine(string.Format("WARNING: Line : {0}, Message : {1} ", e.Exception.LineNumber, e.Exception.Message));
                }
                else if (e.Severity == XmlSeverityType.Error)
                {
                    sb.AppendLine(string.Format("ERROR: Line : {0}, Message : {1} ", e.Exception.LineNumber, e.Exception.Message));
                }
              isvalid = false;
            };
            XmlReader readXml = XmlReader.Create(new StringReader(Xml), settings);
            
            while (readXml.Read()) { }
            var xdoc = XDocument.Parse(Xml);// (xmlFile);

            }
            catch (XmlSchemaValidationException val1)
            {
                isvalid = false;
            }

            var errores= sb.ToString();
            //puedes guardar la cadena errores en un log o mosrarla en pantalla. 
            if (errores != "")
                MessageBox.Show(errores, "Errores");
            return isvalid;
        }
Le pasamos este XML con fallos provocados.

Cita:
<?xml version="1.0" encoding="utf-16"?>
<RegFactuSistemaFacturacion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<Cabecera xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<ObligadoEmision xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<NombreRazon>Nom Empresa</NombreRazon>
<NIF>Nif Empresa</NIF>
</ObligadoEmision>
<RemisionVoluntaria xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<FechaFinVeriFactu />
<Incidencia>N</Incidencia>
</RemisionVoluntaria>
</Cabecera>
<RegistroFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<RegistroAlta xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDVersion>1.0</IDVersion>
<IDFactura>
<IDEmisorFactura>Nif Empresa</IDEmisorFactura>
<NumSerieFactura>VC1-24-100020</NumSerieFactura>
<FechaExpedicionFactura>23/12/2024</FechaExpedicionFactura>
</IDFactura>
<NombreRazonEmisor>Nom Empresa</NombreRazonEmisor>
<TipoFactura>F2</TipoFactura>
<FechaOperacion>23-12-2024</FechaOperacion>
<DescripcionOperacion>Venta de materiales servidos cliente contado.</DescripcionOperacion>
<CuotaTotal>0.42</CuotaTotal>
<ImporteTotal>2.42</ImporteTotal>
<Encadenamiento>
<RegistroAnterior>
<IDEmisorFactura>Nif Empresa</IDEmisorFactura>
<NumSerieFactura>VC1-24-100019</NumSerieFactura>
<FechaExpedicionFactura>20-12-2024</FechaExpedicionFactura>
<Huella>944ED876A480F5204DD37DA82802966A49231DB340291EC8386B7380A46FC6D7</Huella>
</RegistroAnterior>
</Encadenamiento>
<SistemaInformatico>
<NombreRazon>Mi nombre</NombreRazon>
<NIF>Mi Nif</NIF>
<NombreSistemaInformatico>Facturas Taller 2024</NombreSistemaInformatico>
<IdSistemaInformatico>A1</IdSistemaInformatico>
<Version>5.1.531.1536</Version>
<NumeroInstalacion>001</NumeroInstalacion>
<TipoUsoPosibleSoloVerifactu>S</TipoUsoPosibleSoloVerifactu>
<TipoUsoPosibleMultiOT>N</TipoUsoPosibleMultiOT>
<IndicadorMultiplesOT>N</IndicadorMultiplesOT>
</SistemaInformatico>
<FechaHoraHusoGenRegistro>2024-12-23T11:07:33+01:00</FechaHoraHusoGenRegistro>
<TipoHuella>01</TipoHuella>
<Huella>A75ACD77CA84DE8AB5B7510D3BAC55DF77A97C70A91560B738484CD31A09ADD0</Huella>
</RegistroAlta>
</RegistroFactura>
</RegFactuSistemaFacturacion>

La respuesta.
Cita:
{
ERROR: Line : 9, Message : El elemento 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd:FechaFinVeriFactu' no es válido. El valor '' no es válido según su tipo de datos 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd:fecha' - Error de restricción de patrón.
ERROR: Line : 19, Message : El elemento 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd:FechaExpedicionFactura' no es válido. El valor '23/12/2024' no es válido según su tipo de datos 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd:fecha' - Error de restricción de patrón.
ERROR: Line : 25, Message : El elemento 'RegistroAlta' en espacio de nombres 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd' tiene un elemento secundario 'CuotaTotal' en espacio de nombres 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd' no válido. Lista esperada de elementos posibles: 'FacturaSimplificadaArt7273, FacturaSinIdentifDestinatarioArt61d, Macrodato, EmitidaPorTerceroODestinatario, Tercero, Destinatarios, Cupon, Desglose' en espacio de nombres 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd'.
}
Si quereis pasadme algun archivo de ejemplo para que lo pueda provar o provad vosotros mismos.
Para usarlo hay que tener en el directorio que queramos o el raiz de la aplicacion los XSD y el "xmldsig-core-schema.xsd" para evitar fallos por la rapidez de acceso a la web.
__________________
Uno se alegra de ser útil. (Isaac Asimov)
Responder Con Cita