C# — Как получить правильный номер строки в сообщении об ошибке при проверке XML с помощью XmlSchemaSet?

Итак, я пытаюсь проверить файл xml на соответствие файлу xsd с помощью XmlSchemaSet, и я попытался реализовать следующее solution в моем проекте и находит все ошибки в файле xml, но номер строки, который он получает, всегда равен 1 по какой-то причине. Вот код, который решает эту проблему:

класс xmlValidate:

public class xmlValidate
{
    private IList<string> allValidationErrors = new List<string>();

    public IList<string> AllValidationErrors
    {
        get
        {
            return this.allValidationErrors;
        }
    }

    public void checkForErrors(object sender, ValidationEventArgs error)
    {
        if (error.Severity == XmlSeverityType.Error || error.Severity == XmlSeverityType.Warning)
        {
            this.allValidationErrors.Add(String.Format("<br/>" + "Line: {0}: {1}", error.Exception.LineNumber, error.Exception.Message));
        }
    }
}

Основная функция:

public string validate(string xmlUrl, string xsdUrl)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlUrl);
        xml.Schemas.Add(null, xsdUrl);

        string xmlString = xml.OuterXml;
        XmlSchemaSet xmlSchema = new XmlSchemaSet();
        xmlSchema.Add(null, xsdUrl); 

        if (xmlSchema == null)
        {
            return "No Schema found at the given url."; 
        }

        string errors = "";
        xmlValidate handler = new xmlValidate();
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.CloseInput = true;
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(handler.checkForErrors);
        settings.Schemas.Add(xmlSchema);
        settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema 
                                 | XmlSchemaValidationFlags.ProcessSchemaLocation 
                                 | XmlSchemaValidationFlags.ReportValidationWarnings 
                                 | XmlSchemaValidationFlags.ProcessIdentityConstraints;
        StringReader sr = new StringReader(xmlString); 

        using (XmlReader vr = XmlReader.Create(sr, settings))
        {
            while (vr.Read()) { }
        }

        if (handler.AllValidationErrors.Count > 0)
        {
            foreach (String errorMessage in handler.AllValidationErrors)
            {
                errors += errorMessage; 
            }
            return errors; 
        }

        return "No Errors!"; 
   }

Кто-нибудь видит мою проблему? Заранее спасибо!


person JustThisOnce    schedule 10.11.2019    source источник


Ответы (1)


Может быть, вы загружаете свой XML без форматирования? Попробуйте с XmlDocument xml = new XmlDocument { PreserveWhitespace = true }

Я предполагаю, что это может быть важно для получения правильного номера строки, но я не проверял, если честно.

person rominator007    schedule 10.11.2019
comment
Спасибо за ответ. Я получаю сообщение об ошибке о том, что preserveWhiteSpace не существует в текущем контексте. Откуда эта переменная? - person JustThisOnce; 11.11.2019
comment
извините, ошибка копирования/вставки из моей кодовой базы. это должно быть просто «правда». Я отредактировал свой ответ. - person rominator007; 11.11.2019
comment
Ах, кажется, все, что мне нужно было сделать, это установить xml.PreserveWhitespace = true. Спасибо, чувак, я бы никогда не догадался! Я бы проголосовал за вас, но, думаю, мне еще не разрешено, лол. Спасибо еще раз. - person JustThisOnce; 11.11.2019
comment
Рад, что смог помочь! - person rominator007; 11.11.2019