Путаница проверки .NET XSD - PullRequest
0 голосов
/ 22 января 2011

Я пытаюсь использовать XmlReader и связанный с ним XmlReaderSettings объект для выполнения XSD проверки некоторых документов. Я заявляю, что ValidationEventHandler, который я ожидал, будет вызываться всякий раз, когда читатель сталкивается с проблемой проверки. Однако я получаю XSDValidationException, когда пытаюсь создать читателя.

Есть идеи, что вызвало бы исключение? Сообщение:

System.Xml.Schema.XmlSchemaValidationException: атрибут http://www.w3.org/XML/1998/namespace:base' не объявлен.

Может ли быть проблема с одной из базовых схем?

Ответы [ 3 ]

0 голосов
/ 22 января 2011

Поиск в ваших схемах и документе атрибута xml:base. Если он присутствует, схема, определяющая этот атрибут, должна быть в вашем наборе схем.

0 голосов
/ 20 мая 2015

Пример кода был бы неплох, чтобы быть уверенным в том, что вы делаете, но я могу сделать некоторые предположения, потому что я в том же месте.Я наткнулся на Использование XSD с включениями и адаптировал принятый ответ, чтобы он работал на меня.

Проблема в том, что XmlReader, кажется, не знает, каков базовый путь длявключенная схема, если вы не укажете ее при Create() в XmlReader.Предполагая, что у вас есть путь к файлу XML, используйте XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri) и укажите путь к файлу XML как baseUri.

Пример:

using System.IO;
using System.Xml;
using System.Xml.Schema;

public void LoadXml(string path) {
    XmlDocument doc = new XmlDocument();
    XmlReader docReader;

    XmlReaderSettings rdrOpts = new XmlReaderSettings();
    rdrOpts.ValidationType = ValidationType.Schema;
    rdrOpts.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;

    try {
        // This line is what you're looking for:
        docReader = XmlReader.Create(new FileStream(path, FileMode.Open, FileAccess.Read), rdrOpts, Path.GetDirectoryName(path));
        doc.Load(docReader);
    } catch (System.Xml.Schema.XmlSchemaValidationException ex) {
        //...
    } //and catch any other relevant exceptions here, like System.IO.FileNotFoundException
}
0 голосов
/ 22 января 2011

Убедитесь, что ваш фактический XML-документ не имеет корневого элемента в пространстве имен.

Эта ошибка может появиться, когда ваша проверка схемы имеет целевое пространство имен, но проверяемый документ XML содержит любые корневые элементы без пространства имен.

К сожалению, проверка схемы в этом случае будет генерировать только предупреждение о том, что она не находит подходящую схему для корневого элемента, и это предупреждение отображается только в том случае, если установлен определенный флаг для сообщения о предупреждениях, который не устанавливается при использовании проверки. метод XmlDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...