18

Sometimes, when validating certain XML documents using an XmlValidatingReader, I receive the following error:

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

The same document sometimes succeeds. I cannot figure out why.

My XSD imports the schema like so:

<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" />
 ...

And in the XML document I have the following attributes:

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

Finally, the 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()) {}

This is a standalone exe running .NET 4.0 on Windows 2003.

I've noticed that there's a significant pause when it's trying to validate. Could that be related? Is it trying to download the actual "xml.xsd" schema and not succeeding?

roufamatic
  • 18,187
  • 7
  • 57
  • 86

2 Answers2

11

Because many of the DTDs and XSDs originated from the W3C, they have the problem that many people try to resolve them from their servers, resulting in their being inundated with requests - millions and millions of them. So they started blocking "excessive" requests.

See this blog entry, which also applies to XSDs.

The solution is to use a local copy.

lavinio
  • 23,931
  • 5
  • 55
  • 71
  • I'm giving you the answer since my customer's toolchain requires the schemaLocation to be present. Thanks, I thought I was going crazy! – roufamatic May 25 '11 at 17:15
  • 1
    Actually the location is the second parameter of the schemaLocation right ? ``` ``` But there is no second parameter in the above import. Why would it make a call to the w3 site ? – Sai Ram Reddy Sep 30 '20 at 13:48
7

I'm pretty confident I've solved this one. I checked Fiddler and did see requests going out to w3c.org for the xsd file. A little more research turned up this link; remark #3 seemed to relate to my situation. So if for whatever reason my machine couldn't download the XSD file, then the xml namespace became unavailable. Sadly the real error ("could not reach w3c.org" or what have you) was never reported.

Removing the schemaLocation from the xs:import did the trick.

roufamatic
  • 18,187
  • 7
  • 57
  • 86
  • 1
    You can also set the schemaLocation to a copy of that found on the W3C site (their copyright, but they not only allow this, but very actively encourage it). – Jon Hanna May 25 '11 at 16:31