.net - XmlDocument.Validate 不检查无效的命名空间

标签 .net xml xsd xml-namespaces

我使用以下代码根据 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使用 LocalNameNamespaceUri ;用它来查找 XmlSchemaElement , 使用 GlobalElements .

只有在 i) 您的架构编译成功并且 ii) 您确实有文档根元素的定义时,您才应该尝试验证。

希望对你有帮助...

关于.net - XmlDocument.Validate 不检查无效的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8521368/

相关文章:

javascript - 防止客户端存储 XMLHttpRequest 文档

include - 部分模式包含在多个子模式中

c# - Linq 查询中 OrderBy、Where、Select 的排序

.net - 使用 .NET 读取压缩的 xml

c# - 如何绘制变量在 Visual Studio 中的变化

java - DexArchiveMergerException 程序类型已存在 : a. a.a

XML 架构 : Make the value of a multiple occuring tag unique

java - 如何使用 xml 模式验证 xml?

javascript - 如何将 JavaScript 变量传递给服务器端方法

c# - 为什么我收到这段代码的 ArgumentException?