C# 针对多个模式验证 xml xsd

标签 c# xml validation xsd schema

我正在寻找一种方法来根据内存中或运行时的多个 xsd 模式验证我的 xml 文件,而无需触及磁盘文件系统。

假设我有一个这样的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<addresses xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation='test.xsd'>
</addresses>

然后有一个架构:

<?xml version="1.0" encoding="utf-8"?>
<schema targetNamespace="xxx">
   <!-- include and import declarations -->
   <include schemaLocation="another.xsd"/>
   <import schemaLocation="dev.xsd"/>
 <!--
   this .xsd does not have any schema components defined.
   removed from schema file set.    
   <include schemaLocation="new.xsd"/>
  -->
 <include schemaLocation="old.xsd"/>
 <include schemaLocation="test4.xsd"/>
 <include schemaLocation="test2.xsd"/>
 <include schemaLocation="test3.xsd"/>

假设一些简化的图表看起来像这样:

                                  test.xsd
                          |            |         |
                        test1.xsd  test2.xsd  test3.xsd
                          |     |         
                   test5.xsd   test6.xsd        

等等……

当我使用任何工具进行模式验证时,我会将所有这些 xsd 文件放在一个文件夹中,然后我就可以很好地验证 xml。

我想在不使用文件系统上的目录的情况下达到同样的效果。 我正在考虑将所有这些 xsd 放在一个 zip 中,然后在运行时将它们取回并将它们放入 XmlSchemaSet。问题是我可能有一些与 test.xml 无关的额外 xsd 文件。

有什么方法可以验证内存中有多个 xsd 的 xml 吗?我在考虑使用:

           foreach (String singleSchema in schema.listOfSchemasReferenced)
            {
                using (StringReader stringReader = new StringReader(singleSchema))
                using (XmlTextReader xmlReader = new XmlTextReader(stringReader))
                {
                    var includeSchema = XmlSchema.Read(xmlReader, null);

                    var include = new XmlSchemaInclude();
                    include.Schema = includeSchema;
                    if (mainSchema.TargetNamespace != includeSchema.TargetNamespace)
                        continue;
                    mainSchema.Includes.Add(include);
                }
            }

我在尝试编译模式集时遇到错误,因为 listOfSchemasReferenced 可能在同一个文件夹中放置了很多未实现的 xsd。 当我浏览网络时,我发现 XmlResolver 可能很有用,但我不确定如何在 .zip 和内存中放置的文件的上下文中验证多个 xsd。 如果您对如何解决此问题有任何想法,或者您有一些我可以阅读的示例,那就太好了。任何帮助表示赞赏。

最佳答案

我最终使用如下方法编写了自定义 xml 解析器:

    class XmlResolver : XmlUrlResolver
    {
        internal const string BaseUri = "schema://";

        public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
        {
            if (absoluteUri.Scheme == "schema")
            {
                switch (absoluteUri.LocalPath)
                {
                    case "/ADDRESS.xsd":
                        return new MemoryStream(Encoding.UTF8.GetBytes(Resource.ADDRESS));
                    case "/PERSON.xsd":
                        return new MemoryStream(Encoding.UTF8.GetBytes(Resource.PERSON));
                }
            }
            return base.GetEntity(absoluteUri, role, ofObjectToReturn);
        }
    }

关于C# 针对多个模式验证 xml xsd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23834889/

相关文章:

android - 如何确定 EditText 中的输入是否为整数?

c# - 将代码与空格对齐时阻止 IDE0055 样式分析器

c# - 类型 'X' 在类型 'Y.Z' 中不存在

c# - 右键单击以选择 DataGridView 中的行

mysql - 如何将XML数据导入Mysql表?

xml - 同时迭代两个 for-each 循环

c# - 带有大量 NUnit 测试的开源 .NET 应用程序项目(不是框架或工具项目)

c# - 将 XSLT 中的模板附加到另一个 XSLT

grails - 如何在不保存的情况下使用validate()grails方法?

android - 如何保持对这个购物车按钮的验证?