【问题标题】:C# Validate xml against multiple schemas xsdC# 针对多个模式验证 xml xsd
【发布时间】:2014-07-13 03:32:22
【问题描述】:

我正在寻找一种方法来针对内存中或运行时的多个 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 的上下文中使用。 如果您对如何解决此问题有任何想法,或者您有一些我可以阅读的示例,那就太好了。任何帮助表示赞赏。

【问题讨论】:

    标签: c# xml validation xsd schema


    【解决方案1】:

    我最终使用如下方法编写了一个自定义 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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 2012-09-20
      • 2021-04-11
      • 1970-01-01
      • 2010-12-07
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多