可以在运行时使用代码针对 xsd 验证 xml 吗?

Posted

技术标签:

【中文标题】可以在运行时使用代码针对 xsd 验证 xml 吗?【英文标题】:Possible to validate xml against xsd using code at runtime? 【发布时间】:2010-11-19 15:22:22 【问题描述】:

我有在运行时读取的 xml 文件,是否可以在运行时针对 xsd 文件验证 xml?使用c#

【问题讨论】:

【参考方案1】:

更简单的解决方案..

        try
        
            XmlReaderSettings Xsettings = new XmlReaderSettings();
            Xsettings.Schemas.Add(null, "personDivideSchema.xsd");
            Xsettings.ValidationType = ValidationType.Schema;

            XmlDocument document = new XmlDocument();
            document.Load("person.xml");

            XmlReader reader = XmlReader.Create(new StringReader(document.InnerXml), Xsettings);


            while (reader.Read());
        
        catch (Exception e)
        
            Console.WriteLine(e.Message.ToString());
        

【讨论】:

【参考方案2】:

我也有代码!我在测试中使用它:

    public static bool IsValid(XElement element, params string[] schemas)
    
        XmlSchemaSet xsd = new XmlSchemaSet();
        XmlReader xr = null;
        foreach (string s in schemas)
         // eh, leak 'em. 
            xr = XmlReader.Create(
                new MemoryStream(Encoding.Default.GetBytes(s)));
            xsd.Add(null, xr);
        
        XDocument doc = new XDocument(element);
        var errored = false;
        doc.Validate(xsd, (o, e) => errored = true);
        if (errored)
            return false;

        // If this doesn't fail, there's an issue with the XSD.
        XNamespace xn = XNamespace.Get(
                      element.GetDefaultNamespace().NamespaceName);
        XElement fail = new XElement(xn + "omgwtflolj/k");
        fail.SetAttributeValue("xmlns", xn.NamespaceName);
        doc = new XDocument(fail);
        var fired = false;
        doc.Validate(xsd, (o, e) => fired = true);
        return fired;
    

这个将模式作为字符串(程序集中的文件资源)接收,并将它们添加到模式集中。我验证,如果它无效,我返回 false。

如果没有发现 xml 无效,我会进行否定检查以确保我的架构没有搞砸。它不能保证万无一失,但我用它来查找我的架构中的错误。

【讨论】:

您可能想尝试使用XmlSchema.Read 方法,因为它可以在解析模式时验证模式。【参考方案3】:

试试这个:

public void ValidateXmlDocument(
    XmlReader documentToValidate, string schemaPath)

    XmlSchema schema;
    using (var schemaReader = XmlReader.Create(schemaPath))
    
        schema = XmlSchema.Read(schemaReader, ValidationEventHandler);
    

    var schemas = new XmlSchemaSet();
    schemas.Add(schema);

    var settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas = schemas;
    settings.ValidationFlags =
        XmlSchemaValidationFlags.ProcessIdentityConstraints |
        XmlSchemaValidationFlags.ReportValidationWarnings;
    settings.ValidationEventHandler += ValidationEventHandler;

    using (var validationReader = XmlReader.Create(documentToValidate, settings))
    
        while (validationReader.Read())
        
        
    


private static void ValidationEventHandler(
    object sender, ValidationEventArgs args)

    if (args.Severity == XmlSeverityType.Error)
    
        throw args.Exception;
    

    Debug.WriteLine(args.Message);

【讨论】:

这是最快的,我用过。

以上是关于可以在运行时使用代码针对 xsd 验证 xml 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 php 针对 xsd 验证 xml 文件

要针对多个 xsd 模式验证 XML

针对 xsd 执行 xml 验证

是否可以在 Python 中针对 XSD 1.1 验证 XML 文件?

在客户端使用 JavaScript 针对 XSD 验证 XML

使用 XSD、目录解析器和用于 XSLT 的 JAXP DOM 验证 XML