我使用以下代码根据 XSD 文件验证 XML 文件。当发现错误并且 XML 文件中的 xmlns
值有效时,它会成功调用验证处理程序。当它无效时,不会调用验证处理程序。
private void ui_validate_Click(object sender, EventArgs e)
{
try
{
ui_output.Text = "";
XmlDocument xml_document = new XmlDocument();
xml_document.LoadXml(ui_XML.Text);
xml_document.Schemas.Add(null, XmlReader.Create(new System.IO.StringReader(ui_XSD.Text)));
xml_document.Validate(validation_handler);
}
catch (Exception ex)
{
ui_output.Text = "Exception: " + ex.Message;
}
}
private void validation_handler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
ui_output.Text += "Error: " + e.Message + Environment.NewLine;
break;
case XmlSeverityType.Warning:
ui_output.Text += "Warning: " + e.Message + Environment.NewLine;
break;
}
}
更新 已接受答案的示例:
XmlDocument xml_document = new XmlDocument();
xml_document.Load(@"C:\temp\example.xml");
xml_document.Schemas.Add(null, @"C:\temp\example.xsd");
xml_document.Schemas.Compile();
XmlQualifiedName xml_qualified_name = new XmlQualifiedName(xml_document.DocumentElement.LocalName, xml_document.DocumentElement.NamespaceURI);
bool valid_root = xml_document.Schemas.GlobalElements.Contains(xml_qualified_name);
最佳答案
我处理这个问题的方法是首先实际检查您的 XmlReaderSettings.Schemas 中的文档元素(根元素)是否有一个 XmlSchemaElement| ;如果没有,您将无法运行验证,这就是您不会收到错误的原因。
因此,请确保您的 XmlSchemaSet is compiled ;然后建立一个XmlQualifiedName使用 LocalName和 NamespaceUri ;用它来查找 XmlSchemaElement , 使用 GlobalElements .
只有在 i) 您的架构编译成功并且 ii) 您确实有文档根元素的定义时,您才应该尝试验证。
希望对你有帮助...
关于.net - XmlDocument.Validate 不检查无效的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8521368/