Вы очень близки с вашим решением; что вам нужно сделать, это использовать проверяющий читатель для загрузки вашего XML; таким образом, проверка выполняется с вашей загрузкой за один проход; ошибки проверки не остановят вас от загрузки документа.
Это шаги высокого уровня, которые я обычно использую с вспомогательной функцией ValidateXml; все начинается с скомпилированного XmlSchemaSet:
public bool ValidateXml(XmlSchemaSet xset)
Я установил настройки ридера (что вы тоже сделали):
XmlReaderSettings settings = new XmlReaderSettings { ValidationType = ValidationType.Schema, Schemas = xset, ConformanceLevel = ConformanceLevel.Document };
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
// Use your helper class that collects validation events.
XsdUtils.Utils.SmartValidationHandler svh = new XsdUtils.Utils.SmartValidationHandler(Paschi.Xml.DefaultResolver.Instance);
settings.ValidationEventHandler += svh.ValidationCallbackOne;
Тогда я получаю читателя:
XmlReader xvr = XmlReader.Create(filename, settings);
Затем я читаю файл, который приносит проверку в:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xvr);
Ваш обработчик проверки имеет результаты; я также хочу убедиться, что загруженный элемент документа действительно имеет соответствующее глобальное определение элемента в наборе схем xml.
XmlQualifiedName qn = XmlQualifiedName.Empty;
if (xdoc.DocumentElement != null)
{
if (string.IsNullOrEmpty(xdoc.DocumentElement.NamespaceURI))
{
qn = new XmlQualifiedName(xdoc.DocumentElement.LocalName);
}
else
{
qn = new XmlQualifiedName(xdoc.DocumentElement.LocalName, xdoc.DocumentElement.NamespaceURI);
}
}
return !(svh.HasError || qn.IsEmpty || (!xset.GlobalElements.Contains(qn)));