我正在寻找一种方法来根据内存中或运行时的多个 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/