Pregunta

Quiero prueba (verdadero o falso) si un archivo XML arbitraria coincide con un esquema determinado.

Por lo que vale, el esquema es el esquema WordML Word 2003, que Microsoft define mediante una lista de alrededor de 7 archivos *.xsd.

Uno de estos archivos también incluye el archivo xml.xsd W3C, incluyendo la siguiente declaración:

<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"
    schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import>

Estoy utilizando el código .NET como el siguiente para hacer la validación:

   public static void validate(string filename)
    {
       XmlReaderSettings settings = new XmlReaderSettings();
       settings.Schemas.Add(
           "http://schemas.microsoft.com/office/word/2003/wordml",
           //to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe" 
           @"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd"
           );
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
        XmlReader xmlReader = XmlReader.Create(filename, settings);
        while (xmlReader.Read()) { }
   }

Mi problema es que si me quedo este código en una máquina que no está conectado a Internet, entonces me sale un error XmlSchemaValidationException en el sentido de que no puede encontrar xml.xsd.

Para solucionar este problema, he descargado una copia de xml.xsd y agregarlo explícitamente usando el método settings.Schemas.Add:. La validación ahora funciona correctamente cuando la máquina no está conectado a internet

Sin embargo, cuando la máquina está conectada a la Internet, que ahora recibe un error que indica que The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared..

Así que al parecer yo tampoco necesidad de añadir de forma explícita, o no hacerlo, dependiendo de si la máquina es capaz de descargar en silencio desde internet (o incluso tal vez haya sido previamente capaz de descargar, y tiene que almacenar en caché en alguna parte ).

Por lo tanto, está "condenado si lo hago y condenado si no lo hago". ¿Tengo que tratar de una manera, detectar la excepción y luego tratar de otra manera? ¿O hay una solución más elegante?

¿Fue útil?

Solución

No se puede ver el código, pero En muchas implementaciones esto es manejado por la reorientación de la solicitud de la .xsd a la copia local usando un dispositivo de resolución catálogo. Hay una propiedad XmlReaderSettings.XmlResolver que se puede utilizar para esto. Ver XMLCatalog.net para una aplicación con licencia de Apache que puede utilizar.

Un efecto secundario de esto es que se puede mantener todos los esquemas en caché local. Esto es especialmente importante, ya que bloqueará W3C excesiva lee a su sitio y su código al azar (o peor, el código de su cliente) comenzará a fallar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top