簡體   English   中英

C#針對多個架構xsd驗證xml

[英]C# Validate xml against multiple schemas xsd

我正在尋找一種方法來針對內存中或運行時的多個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);
                }
            }

我遇到錯誤,然后嘗試編譯schemaset,因為listOfSchemasReferenced可能在同一文件夾中放置了許多未實現的xsd。 當我瀏覽Web時,我已經看到XmlResolver可能有用,但是我不確定如何在驗證文件中將多個xsd用於.zip和內存中。 如果您有任何解決該問題的想法,或者您可以閱讀一些示例,那將是很棒的。 任何幫助表示贊賞。

我最終使用像下面這樣的方法編寫了一個自定義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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM