2011-03-01 13 views
5

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?

Respuesta

3

Si estoy leyendo la especificación XML correctamente, los principales espacios en blanco en los valores de los atributos deben ser recortado (como el analizador XML de .NET hace):

http://www.w3.org/TR/REC-xml/#AVNormalize

"Si el tipo de atributo no es CDATA , entonces el procesador XML DEBE seguir procesando el valor del atributo normalizado descartando cualquier espacio inicial y final (# x20) caracteres [...] "

+0

eso es interesante gracias; el analizador de terceros adoptado parece no hacer ningún ajuste en absoluto. – systempuntoout

2

xs:decimal es un tipo de esquema XML (no es un tipo DTD) y el relevant part of the XML Schema spec es cómo se aplica el espacio en blanco a xs: decimal:

whiteSpace es aplicable a todos · atomic · y · list · datatypes. Para todos · atómica · tipos de datos que no sean de cadena (y tipos · derivados · por · restricción · de ella) el valor del espacio en blanco es colapso y no puede ser cambiado por un autor esquema

xs:decimal no es derivado de xs:string, por lo que el espacio en blanco debe permitirse e ignorarse. "Contraer" significa recortar espacios en blanco iniciales y finales y colapsar ejecuciones internas en caracteres de espacio único.

Cuestiones relacionadas