Проверка XML с использованием схемы XSD - PullRequest
11 голосов
/ 21 февраля 2009

Следующий код помогает мне проверить 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?

Ответы [ 2 ]

28 голосов
/ 21 февраля 2009

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

Создайте 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));
}
3 голосов
/ 21 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...