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

c# validation xsd

30152 просмотра

2 ответа

Следующий код помогает мне проверить файл 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 также сообщает мне, что это за ошибки, но не сообщает мне, «где» или «в какой строке» они находятся. Есть ли способ получить номер строки, где не удается проверить XML?

Автор: Elroy Источник Размещён: 12.11.2019 09:58

Ответы (2)


28 плюса

Решение

Не будет ли это делать то, что вы после?

Создайте 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));
}
Автор: VonC Размещён: 21.02.2009 12:02

3 плюса

ValidationEventArgs.Message включает строку / столбец в свой текст.

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

Автор: Richard Размещён: 21.02.2009 12:06
32x32