Ver Mensaje Individual
  #5  
Antiguo 27-12-2024
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Reputación: 5
rci Va por buen camino
Hola bmfranky, muchas gracias por tu ayuda.

A mi no me ha funcionado pero puede ser que sea un problema mío y/o que me falte hacer algún ajuste.
Cuando intento validar un xml generado por mi programa y que es válido y se envia correctamente, tu validador me da 43 warnings del estilo:
Cita:
No se puede encontrar la información de esquema para el elemento 'RegistroFacturacionAltaType'.
No entiendo muy bien el mensaje porque el elemento que indica en cada línea de warning, si está en el XML.

Por otro lado cuando intento validar un xml Incorrecto, generado por mi programa y que si se envía da un error que falta un dato obligatorio, tu validador me da los mismos warnings que con el primer fichero, pero menos líneas porque algunos elementos no están y no me da ningún error indicando que falta el elemento obligatorio.

Otra cosa que me extraña mucho es que el xml que has puesto tu de ejemplo para validar, es distinto del xml que genera mi programa (y que se envían sin problemas)
Por ejemplo donde tu XML dice 'RegistroAlta' mi XML dice 'RegistroFacturacionAltaType'. Mirando el esquema SuministroInformacion.xsd veo que es el mismo elemento pero lo tuyo es el nombre y lo mío es el tipo.
Cita:
<element name="RegistroAlta" type="sf:RegistroFacturacionAltaType" />
Después me he fijado que tu ejemplo es de un XML completo (con elemento base RegFactuSistemaFacturacion), listo para enviar, ya empaquetado, con una o varias facturas dentro (RegistroFactura y RegistroAlta).

En cambio el XML que intento enviar yo es de una sola factura (con elemento base RegistroFacturacionAltaType o RegistroAlta ), sin empaquetar para enviar, porque precisamente, quiero validar cada factura antes de poner dentro de un paquete para enviar, porque luego falla todo el paquete y no indica que factura está mal.

Supongo que el problema que tengo es este.
Finalmente he probado empaquetar en memoria cada factura una a una antes de validarla y validar ese XML. Creo que así ya me servirá.

Muchas gracias!
Cita:
Empezado por bmfranky Ver Mensaje
Hola os copio un trozoi de codigo semi funcional, valida el contenido, la estructura da información 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.




La respuesta.

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.
Responder Con Cita