XmlDocument.Validate не проверяет наличие недопустимого пространства имен - PullRequest
2 голосов
/ 15 декабря 2011

Я использую следующий код для проверки XML-файла по сравнению с XSD-файлом. Он успешно вызывает обработчик проверки при обнаружении ошибок и допустимом значении xmlns в файле XML. Когда он недействителен, обработчик проверки не вызывается.

private void ui_validate_Click(object sender, EventArgs e)
{
    try
    {
        ui_output.Text = "";

        XmlDocument xml_document = new XmlDocument();
        xml_document.LoadXml(ui_XML.Text);
        xml_document.Schemas.Add(null, XmlReader.Create(new System.IO.StringReader(ui_XSD.Text)));
        xml_document.Validate(validation_handler);
    }
    catch (Exception ex)
    {
        ui_output.Text = "Exception: " + ex.Message;
    }
}

private void validation_handler(object sender, ValidationEventArgs e)
{
    switch (e.Severity)
    {
        case XmlSeverityType.Error:
            ui_output.Text += "Error: " + e.Message + Environment.NewLine;
            break;
        case XmlSeverityType.Warning:
            ui_output.Text += "Warning: " + e.Message + Environment.NewLine;
            break;
    }
}

Обновление Пример для принятого ответа:

XmlDocument xml_document = new XmlDocument();
xml_document.Load(@"C:\temp\example.xml");
xml_document.Schemas.Add(null, @"C:\temp\example.xsd");
xml_document.Schemas.Compile();

XmlQualifiedName xml_qualified_name = new XmlQualifiedName(xml_document.DocumentElement.LocalName, xml_document.DocumentElement.NamespaceURI);
bool valid_root = xml_document.Schemas.GlobalElements.Contains(xml_qualified_name);

Ответы [ 3 ]

5 голосов
/ 15 декабря 2011

Способ, которым я справляюсь, заключается в том, чтобы сначала проверить, что для элемента документа (корневого элемента) в вашем XmlReaderSettings.Schemas есть элемент XmlSchemaElement если нет, вы не можете запустить проверку, поэтому вы не получаете ошибки.

Итак, убедитесь, что ваш XmlSchemaSet скомпилирован ; затем создайте XmlQualifiedName , используя LocalName и NamespaceUri ; используйте это для поиска XmlSchemaElement , используя GlobalElements .

Вы должны пытаться проверить, только если i) ваши схемы успешно скомпилированы и ii) у вас действительно есть определение корневого элемента документа.

Надеюсь, это поможет ...

1 голос
/ 09 декабря 2013

@ PetruGardea - большое спасибо за ваш ответ !!!

Я просто добавил сюда код, чтобы продемонстрировать ваше решение, чтобы другим не приходилось гуглить:

1 голос
/ 15 декабря 2011

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

Быстро подумав, что у вас есть как минимум два варианта:1) прочитать пространство имен из документа и использовать отдельную проверку, чтобы проверить, правильно ли это, или 2) проверить, есть ли возможность изменить поведение валидатора, изменив его настройки, чтобы он уведомлял о том, что определения для данного пространства имен не найдены.

...