XmlSchemaValidationException.LineNumber и LinePosition равны 0 при проверке схемы Xml с помощью XDocument.Validate - PullRequest
6 голосов
/ 09 января 2012

Я пытаюсь проверить фрагмент XML с помощью схемы XML с помощью метода расширения XDocument.Validate.Всякий раз, когда используется недопустимый фрагмент Xml, ValidationEventHandler срабатывает правильно, однако оба свойства LineNumber и LinePosition исключения XmlSchemaValidationException равны 0.

private bool Validate(XDocument doc)
{
    bool isValid = true;
    List<string> validationErrors = new List<string>();

    XmlSchemaSet schemas = new XmlSchemaSet();
    schemas.Add(null, "MyCustomSchema.xsd");

    doc.Validate(schemas, (sender, args) =>
    {
        validationErrors.Add(String.Format("{0}: {1} [Ln {2} Col {3}]", 
            args.Severity, 
            args.Exception.Message, 
            args.Exception.LineNumber, 
            args.Exception.LinePosition));

        isValid = false;
    }, false);

    return isValid;
}

Моя цель в вышеприведенном примере - использовать validationErrors для информирования пользователя опочему проверка не удалась.Однако при использовании этого метода значения LineNumber и LinePosition равны 0.

Фрагмент кажется достаточно простым и работает, как ожидается, с точки зрения проверки как действительных, так и недействительных фрагментов XML.

Заранее спасибо!

1 Ответ

5 голосов
/ 25 января 2012

Вы больше не проверяете текстовое представление Xml, но объектную модель.В результате нет линий и позиций, потому что в памяти нет файлов, кроме объектов XElement, XAttribute и т. Д.Еще один полезный совет - спросите себя - какую строку и позицию следует вернуть, если вы изменили (например, был добавлен элемент) XDocument после его загрузки, но до запуска проверки?Если вы не создаете или не изменяете Xml, самым быстрым способом будет использование XmlReader для проверки вашего документа Xml.В качестве бонуса - если вход представляет собой файл или поток - вы должны получить информацию о линии и местоположении в случае ошибок проверки.

...