Вопрос:

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

c# validation xsd

30152 просмотра

2 ответа

442 Репутация автора

Следующий код помогает мне проверить файл 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 Источник Размещён: 21.02.2009 11:46

Ответы (2)


28 плюса

905529 Репутация автора

Решение

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

Создайте 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 плюса

93791 Репутация автора

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

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

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