«Атрибут 'http://www.w3.org/XML/1998/namespace:lang' не объявлен». - PullRequest
10 голосов
/ 25 мая 2011

Иногда , при проверке определенных документов XML с использованием XmlValidatingReader я получаю следующую ошибку:

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

Иногда один и тот же документ успешно выполняется. Я не могу понять, почему.

Мой XSD импортирует схему следующим образом:

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

А в документе XML у меня есть следующие атрибуты:

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

Наконец, 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()) {}

Это отдельная исполняемая программа, работающая на .NET 4.0 в Windows 2003.

Я заметил, что есть существенная пауза, когда он пытается проверить. Может ли это быть связано? Он пытается загрузить действительную схему "xml.xsd" и не удается?

Ответы [ 2 ]

8 голосов
/ 25 мая 2011

Поскольку многие DTD и XSD возникли из W3C, у них возникает проблема, заключающаяся в том, что многие люди пытаются разрешить их со своих серверов, в результате чего их наводняют запросы - миллионы и миллионы из них.Поэтому они начали блокировать «чрезмерные» запросы.

См. эту запись в блоге , которая также применяется к XSD.

Решение состоит в том, чтобы использовать локальную копию.

3 голосов
/ 25 мая 2011

Я уверен, что решил это.Я проверил Fiddler и увидел запросы, отправляемые на w3c.org для файла xsd.Немного больше исследований нашло эту ссылку ;замечание № 3, похоже, касалось моей ситуации.Поэтому, если по какой-либо причине моя машина не смогла загрузить файл XSD, пространство имен xml стало недоступным.К сожалению, о настоящей ошибке («не удалось связаться с w3c.org» или о чем-то еще) не сообщалось.

Удаление schemaLocation из xs:import дало результат.

...