C # Проверка xml против нескольких схем xsd

1

Я ищу способ проверить мой XML файл на несколько схем xsd в памяти или во время выполнения, не касаясь файловой системы диска.

Скажем, у меня есть 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. Проблема в том, что у меня могут быть дополнительные файлы xsd, которые не связаны с test.xml.

Есть ли способ проверить xml с помощью mutiple xsd в памяти? Я думал об использовании:

           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 может быть полезен, но я не уверен, как использовать в контексте проверки нескольких xsd в контексте файлов, помещенных в.zip и в память. Если у вас есть идеи, как решить эту проблему, или у вас есть несколько примеров, которые я мог бы прочитать, это было бы здорово. Любая помощь оценивается.

Теги:
validation
schema
xsd

1 ответ

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);
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню