Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 791
roufamatic Avatar asked May 24 '11 22:05

roufamatic


2 Answers

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.

like image 158
lavinio Avatar answered Sep 21 '22 18:09

lavinio


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.

like image 26
roufamatic Avatar answered Sep 20 '22 18:09

roufamatic