![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
![]() Hola!
Estoy intentando validar un fichero XML contra el esquema XSD utilizando C# .Net Quiero hacerlo porque en algunos casos el XML que genero tiene algún error y cuando lo envío a un webservice recibo una excepción con el mensaje: Cita:
He buscado por Internet y he encontrado varios ejemplos pero no consigo que funcione ninguno para mi caso. Me encuentro con dos situaciones distintas, o me da un error que no tiene que ver con el campo que falta o me acepta el XML como válido cuando no lo es. El esquema XSD es el siguiente: h t t ps://prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/SuministroInformacion.xsd Si lo utilizo directamente para validar el fichero XML que he generado, siguiendo toda la normativa pero sin el elemento Desglose, en lugar de decirme que falta ese elemento, me da el siguiente error: Cita:
Aún así, he descargado el fichero XSD, lo he modificado quitando las referencias de Signature y he validado contra ese XSD modificado. En ese caso no da error pero tampoco me indica que falta el elemento Desglose. De esta forma me lo da como válido cuando realmente no lo es. Después he pensado que cuando intenta validar tiene algún problema al leer dentro del esquema XSD y no reconoce la parte que indica del elemento Signature. Con el esquema XSD original he intentado añadir el namespace ds con la url "http://www.w3.org/2000/09/xmldsig#" pero nada. También he intentado añadir el fichero XSD relacionado con esa url xmldsig-core-schema.xsd (que también me he descargado) pero tampoco me funciona. Alguien ha conseguido validar un fichero XML contra un esquema XSD en C# y podría echarme un cable por favor? Muchas gracias!! |
#2
|
|||
|
|||
Hola,
Creo que el problema que puedes tener es relativo a la validacion de la parte del esquema relativa a la firma. Prueba a quitar del xsd toda la parte relativa a la firma. Luego prueba la validacion. Si funciona no es lo ideal pero la firma, en principio, no nos hace falta |
#3
|
|||
|
|||
Cita:
Lo que me propones ya lo he hecho y ya no da error pero no valida bien: Cita:
|
#4
|
||||
|
||||
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; } Cita:
La respuesta. Cita:
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) |
#5
|
||||
|
||||
Con mi codigo no hay que tocar nada en los xsd, la primera linea es para evitar el error de no se encuentra....
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
#6
|
||||
|
||||
Validar Xml de Consulta
Hola, una vez puesto he terminado el codigo para verificar las consultas antes de enviarlas...
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("<ConsultaFactuSistemaFacturacionType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<ConsultaFactuSistemaFacturacionType xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd\">"); Xml = Xml.Replace("ConsultaFactuSistemaFacturacionType", "ConsultaFactuSistemaFacturacion"); //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 + "ConsultaLR.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; } Código:
<?xml version="1.0" encoding="utf-16"?> <ConsultaFactuSistemaFacturacion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd"> <Cabecera xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd"> <IDVersion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">1.0</IDVersion> <ObligadoEmision xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"> <NombreRazon>Mi Nombre</NombreRazon> !<<<--- deveria estar despues de aqui el nif , lo he borrado </ObligadoEmision> </Cabecera> <FiltroConsulta xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/ConsultaLR.xsd"> <PeriodoImputacion> <Ejercicio xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">2024</Ejercicio> <Periodo xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">12</Periodo> </PeriodoImputacion> <FechaExpedicionFactura /> </FiltroConsulta> </ConsultaFactuSistemaFacturacion> Cita:
Las funciones devuelven un bool, true cuando a pasado la verificacion, si false , revisar el string global errores...
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
#7
|
|||
|
|||
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:
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:
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:
|
#8
|
||||
|
||||
Cita:
De todas formas pasame un Xml completo a ver si te lo puedo modificar para que te funcione.
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
#9
|
|||
|
|||
Cita:
He visto que una vez empaqueto cada registro de facturación (RegistroFacturacionAltaType o RegistroAlta) dentro de un paquete listo para enviar (RegFactuSistemaFacturacion) en el xml ya salen los mismos nombres que en tu ejemplo (RegistroAlta). Cita:
Cita:
|
#10
|
||||
|
||||
Cita:
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Bloque del esquema SistemaInformatico | CarlosMz | Registros de Facturacion y Eventos (XML) | 7 | 08-11-2024 08:28:14 |
Esquema BD | Zina | Varios | 8 | 10-11-2016 17:00:01 |
¿ como validar xml contra esquema? | JXJ | Varios | 2 | 27-03-2011 04:09:41 |
Esquema programación. | REHome | Varios | 6 | 12-04-2007 22:03:05 |
crear archivos esquema *.sch | KmoCuesta | Tablas planas | 0 | 16-09-2005 21:48:05 |
![]() |
|