Почему XmlDocument Validate не создает исключений для xml с другим пространством имен? - PullRequest
0 голосов
/ 04 марта 2011

Я проверяю некоторые внешние XML-документы по моей схеме XSD:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"       
           version="2011-03-01">
    <xs:element name="Document" type="DocumentType" />
    <xs:complexType name="DocumentType">
        <xs:sequence>
            <xs:element name="Author" type="string" minOccurs="0" />
            <xs:element maxOccurs="unbounded" name="Receiver" type="string" />
        </xs:sequence>
    </xs:complexType>

Моя схема не использует пространства имен. Хорошо работает, но у меня проблемы с определенным XML. Это файл Excel, сохраненный в формате XLM . Это полностью недействительно, но мой валидатор не жалуется. Это недопустимо в соответствии с моей схемой, но мой метод не выдает никаких исключений! Это выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<office:document-content
    xmlns:office="foo">
    <office:bar></office:bar>
</office:document-content>

вот мой код:

public void Validate(Stream streamWithXML)
{
XmlReaderSettings settings = new XmlReaderSettings();

settings.Schemas.Add(settings.Schemas.Add("", xsdPath));
settings.ValidationType = ValidationType.Schema;

XmlReader reader = XmlReader.Create(streamWithXML, settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
document.Validate(eventHandler);
reader.Close();
}

static void ValidationEventHandler(object sender, ValidationEventArgs e)
{}

У вас есть какие-либо подсказки? Я полагаю, это потому, что этот конкретный документ имеет некоторые объявления встроенных пространств имен. Однако онлайн-валидатор на http://tools.decisionsoft.com/schemaValidate/ выдает исключение:

Не удается найти объявление элемента 'Офис: документ-содержание'

.

что правильно. Есть ли способ заставить валидатор .NET выдавать исключение в этом случае?

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Это не вызывает исключение, потому что оно не предназначено для.

Документация показывает, что предполагаемое использование заключается в создании обработчика события проверки и передаче его в метод Validate.

http://msdn.microsoft.com/en-us/library/ms162371.aspx

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

ValidationEventArgs в вашем событииобработчик содержит исключение, серьезность и сообщения:

http://msdn.microsoft.com/en-us/library/system.xml.schema.validationeventargs.aspx

Пример кода в первой ссылке показывает использование попер.

0 голосов
/ 04 марта 2011

Вам необходимо установить ValidationFlags в объекте настроек, чтобы включить ReportValidationWarnings.

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