Подтвердить что ты не робот

Проверка Xml с использованием схемы XSD

Следующий код помогает мне проверить XML файл с помощью схемы XSD.

XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, xsdFilePath);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);
XmlDocument document = new XmlDocument();
document.Load(xmlFilePath);
XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings);

while (rdr.Read())
{

}
isValid = true;

ValidationEventHandler также сообщает мне, что такое ошибки, но не говорит мне о "where" или "на какой строке" они находятся. Есть ли способ получить номер строки, где XML не может быть проверен?

4b9b3361

Ответ 1

Не сделал бы это то, что вам нужно?

Создайте объект XmlReaderSettings и включите предупреждения через этот объект.

К сожалению, кажется, что нет способа передать свой собственный объект XmlReaderSettings в XmlDocument.Validate().
Вместо этого вы можете использовать проверки XmlReader и XmlNodeReader для проверки существующего XmlDocument (используя XmlNodeReader с StringReader, а не XmlDocument)

XmlDocument x = new XmlDocument();
x.LoadXml(XmlSource);

XmlReaderSettings settings = new XmlReaderSettings();
settings.CloseInput = true;     
settings.ValidationEventHandler += Handler;

settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null, ExtendedTreeViewSchema);
settings.ValidationFlags =
     XmlSchemaValidationFlags.ReportValidationWarnings |
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ProcessInlineSchema |
XmlSchemaValidationFlags.ProcessSchemaLocation ;

StringReader r = new StringReader(XmlSource);

using (XmlReader validatingReader = XmlReader.Create(r, settings)) {
        while (validatingReader.Read()) { /* just loop through document */ }
}

И обработчик:

private static void Handler(object sender, ValidationEventArgs e)
{
        if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning)
          System.Diagnostics.Trace.WriteLine(
            String.Format("Line: {0}, Position: {1} \"{2}\"",
                e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message));
}

Ответ 2

ValidationEventArgs.Message содержит строку/столбец в тексте.

ValidationEventArgs.Exception имеет поля для строки и столбца.