你已经非常接近你的解决方案了;您需要做的是使用验证读取器来加载您的 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)));