He desarrollado un pequeño script C#
que abre un archivo XLS
, lo analiza y crea una lista de archivos XML
que los valida contra un archivo XSD
.Validación XML: valor de atributo decimal que comienza con un espacio
He intentado cargar estos archivos validados a un servicio en línea de un tercero (la misma compañía que me dio la documentación/xsd) y un archivo generado no se acepta porque NO ES VÁLIDO.
El archivo no se acepta porque tiene un espacio al comienzo de un valor decimal en un atributo de nodo; eliminar este espacio soluciona el problema.
He creado un caso de prueba simple donde el método XDocument Validate valida el XML con el espacio adicional sin ningún problema.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Schema;
using System.Xml.Linq;
using System.Xml;
using System.IO;
namespace TestParser {
class Program {
static void Main(string[] args) {
string xsdMarkup =
@"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name='option'>
<xs:complexType>
<xs:simpleContent>
<xs:extension base='xs:string'>
<xs:attribute name='value' type='xs:decimal'>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
XDocument doc1 = new XDocument(
new XElement("option","test", new XAttribute("value", " 423423")
));
Console.WriteLine("Validating doc1");
bool errors = false;
doc1.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
}, true);
Console.WriteLine("doc1 {0}", errors ? "not valid" : "validated");
Console.WriteLine();
Console.WriteLine("Contents of doc1:");
Console.WriteLine(doc1);
}
}
}
El resultado es este:
Validating doc1
doc1 validated
Contents of doc1:
<option value=" 423423">test</option>
¿Es correcto que el Analizador de C# XML valida este XML?
¿Es posible forzar al analizador a ser más exigente con este formato?
eso es interesante gracias; el analizador de terceros adoptado parece no hacer ningún ajuste en absoluto. – systempuntoout