正在将带导入的嵌入式XSD加载到数据集中

本文关键字:加载 数据 数据集 集中 XSD 嵌入式 导入 | 更新日期: 2023-09-27 18:27:51

我的目标是将带有导入的嵌入xsd加载到DataSet中,然后基于xsd生成表。

我正在尝试加载一个具有XML架构的数据集,该架构由导入的多个XSD文件组成。对文件系统上的文件执行此操作没有问题,我只需将主xsd文件交给它,所有内容都可以加载,所有xsd导入都得到了解决。我想做的是将xsd嵌入到dll中,这样它就不会出现在文件系统中。嵌入xsd文件的项目与将访问xsd文件以加载到数据集中的项目是分开的。

DataSet.ReadXmlSchema方法可以采用流、XmlReader、字符串uri或XmlTextReader。我加载dll,然后使用程序集访问主架构文件没有问题。GetManifestResourceStream(schemaPath),如果我的模式只是一个文件,那就好了。问题是,一旦我将其传递给DataSet.ReadXmlSchema方法,它就找不到任何导入。

我尝试使用XmlReader,并将XmlReaderSettings对象与我为以前的问题编写的自定义xml解析器一起使用(我知道有效)。我过去曾使用自定义xml解析器将嵌入dll中的类似模式加载到XmlSchemaSet中,它的工作原理很有魅力。因此,当我进行XmlReader.Create调用时,我会传入使用自定义XmlResolver的XmlReaderSettings,但当我将此XmlReader传递给DataSet.ReadXmlSchema方法时,它也找不到导入的架构文件。我在重载的GetEntity方法中设置了一个断点,它永远不会被命中。因此XmlReader似乎没有使用我提供的XmlResolver。我对XmlTextReader也有同样的问题。

关于如何将带有导入的嵌入模式加载到数据集中,有什么想法吗?我的最后手段是将嵌入的xsd文件临时复制到文件系统中,以创建数据集,然后删除它们,尽管我正在努力避免这种情况。

正在将带导入的嵌入式XSD加载到数据集中

不幸的是,不可能从作为资源嵌入的多个XSD加载数据集。

理由在DataSet类的以下方法中:

internal void ReadXSDSchema(XmlReader reader, bool denyResolving)

在那里编写代码的方式中,它使用了XmlSchemaSet;它使用您传递的读取器(XmlReader)来加载架构,将其添加到XmlSchemaSet并进行编译。

不幸的是,要在使用嵌入资源时编译XmlSchemaSet,必须为XmlSchemaSet对象提供xml解析程序!。。。问题是,在这个过程中,没有一个可以在这一点上使用。虽然读卡器设置可以使用解析器进行配置,但正如您所知,它是Write-only(没有getter)。

要测试我所说的内容,请尝试从相同的嵌入式资源加载XmlSchemaSet;您会注意到,无论您尝试什么,解析程序都必须设置在XmlSchemaset级别,而不是XmlReader级别。

我建议您查看异常堆栈,然后使用Reflector或类似的东西查看代码。如果你得出不同的结论,请分享。