XPathNavigator.CheckValidity проверяет недействительный документ XML - PullRequest
1 голос
/ 03 декабря 2010

Я пытаюсь использовать XPathNavigator.CheckValidity для проверки XML-документа.Каким-то образом я смог написать тесты, которые прошли с использованием этого метода, но теперь (загадочно) больше не проходят.Единственное, что я могу вспомнить, что изменилось, - это перейти с .NET 2 на .NET 3.5, но я не могу найти никакой документации о том, что здесь изменилось во время этого перехода.

Вот пример программы:

void Main()
{
    try
    {
        GetManifest().CreateNavigator().CheckValidity(GetSchemaSet(), (sender, args) => {
            // never get in here when debugging
            if (args.Severity == XmlSeverityType.Error) {
                throw new XmlSchemaValidationException("Manifest failed validation", args.Exception);
            }
        }); // returns true when debugging
    }
    catch (XmlSchemaValidationException)
    {
        // never get here
        throw;
    }

    // code here runs
}

IXPathNavigable GetManifest()
{
    using (TextReader manifestReader = new StringReader("<?xml version='1.0' encoding='utf-8' ?><BadManifest><bad>b</bad></BadManifest>"))
    {
        return new XPathDocument(manifestReader);
    }
}

XmlSchemaSet GetSchemaSet() 
{
    var schemaSet = new XmlSchemaSet();
    using (var schemaReader = new StringReader(Schema)){
        schemaSet.Add(XmlSchema.Read(schemaReader, null));
    }

    return schemaSet;
}

const string Schema = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://www.engagesoftware.com/Schemas/EngageManifest"">
  <xs:element name=""EngageManifest"">
    <xs:complexType>
      <xs:all>
        <xs:element name=""Title"" type=""xs:string"" />
        <xs:element name=""Description"" type=""xs:string"" />
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>";

Я попробовал решение на Проверка XML с помощью схемы XSD без изменения XML с помощью C # , но я получаю тот же результат ... Я, должно быть, упускаю какой-то большойрассмотрение того, как работает эта проверка, но я не вижу ее ...

1 Ответ

3 голосов
/ 06 декабря 2010

Проблема в том, что ваш XML использует пространство имен по умолчанию, но XSD указывает целевое пространство имен. Если вы укажете <BadManifest xmlns="http://www.engagesoftware.com/Schemas/EngageManifest"> в своем XML, вы должны обнаружить, что валидатор сообщает об ошибках, как и ожидалось. В противном случае, поскольку он не распознает пространство имен XML, он просто игнорирует его.

...