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