2011-05-24 3 views
7

veces, al validar ciertos documentos XML utilizando un XmlValidatingReader, recibo el siguiente error:"El atributo 'http://www.w3.org/XML/1998/namespace:lang' no está declarado."

System.Xml.Schema.XmlSchemaValidationException: 
"The 'http://www.w3.org/XML/1998/namespace:lang' attribute is not declared." 

El mismo documento a veces tiene éxito. No puedo entender por qué.

Mi XSD importa el esquema de este modo:

<xs:schema id="myschemaId" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://mytargetnamespace.com" 
     xmlns="http://mytargetnamespace.com" 
     xmlns:mm="http://mytargetnamespace.com" 
     elementFormDefault="qualified"> 
<xs:import namespace="http://www.w3.org/XML/1998/namespace" 
      schemaLocation="http://www.w3.org/2001/xml.xsd" /> 
... 

Y en el documento XML que tengo los siguientes atributos:

<root xmlns="http://mytargetnamespace.com"   
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://mytargetnamespace.com myschema.xsd"> 

Por último, los XmlReaderSettings:

const XmlSchemaValidationFlags validationFlags = 
      XmlSchemaValidationFlags.ProcessInlineSchema | 
      XmlSchemaValidationFlags.ProcessSchemaLocation | 
      XmlSchemaValidationFlags.ReportValidationWarnings | 
      XmlSchemaValidationFlags.AllowXmlAttributes; 

// Set the validation settings. 
var settings = new XmlReaderSettings 
        { 
         ValidationType = ValidationType.Schema, 
         ValidationFlags = validationFlags, 
         DtdProcessing = DtdProcessing.Parse 
        }; 
settings.ValidationEventHandler += OnValidationEventHandler; 

// Create the XmlReader object. 
var reader = XmlReader.Create(_xmlFilePath, settings); 

// Parse the file. 
while (reader.Read()) {} 

Este es un exe independiente ejecutando .NET 4.0 en Windows 2003.

Me he dado cuenta de que hay una pausa importante cuando intenta validar. ¿Podría eso estar relacionado? ¿Está intentando descargar el esquema "xml.xsd" real y no está teniendo éxito?

Respuesta

7

Dado que muchas de las DTD y XSD se originaron en el W3C, tienen el problema de que muchas personas intentan resolverlas desde sus servidores, lo que provoca que se llenen de solicitudes, millones y millones de ellas. Entonces comenzaron a bloquear solicitudes "excesivas".

Consulte this blog entry, que también se aplica a los XSD.

La solución es utilizar una copia local.

+0

Te estoy dando la respuesta ya que la cadena de herramientas de mi cliente requiere que schemaLocation esté presente. Gracias, ¡pensé que me estaba volviendo loco! – roufamatic

2

Estoy bastante seguro de que he resuelto este. Revisé Fiddler y vi las solicitudes que se enviaban a w3c.org para el archivo xsd. Un poco más de investigación apareció this link; la observación # 3 parecía estar relacionada con mi situación. Entonces, si por algún motivo mi máquina no pudo descargar el archivo XSD, el espacio de nombres xml dejó de estar disponible. Lamentablemente, el error real ("no se pudo llegar a w3c.org" o lo que sea) nunca se informó.

Quitando el schemaLocation del xs:import hizo el truco.

+1

También puede establecer schemaLocation en una copia de la que se encuentra en el sitio W3C (sus derechos de autor, pero no solo lo permiten, sino que lo alientan muy activamente). –

Cuestiones relacionadas