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;
}
Test
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>
Respuesta:
Cita:
ERROR: Line : 7, Message : El contenido del elemento 'ObligadoEmision' en espacio de nombres 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd' está incompleto. Lista esperada de elementos posibles: 'NIF' en espacio de nombres 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd'.
|
Las funciones devuelven un bool, true cuando a pasado la verificacion, si false , revisar el string global errores...