将带有Imports的嵌入式XSD加载到DataSet中

时间:2012-03-15 16:32:31

标签: c# xsd dataset import

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

我正在尝试使用XML Schema加载DataSet,该架构由导入的多个XSD文件组成。使用位于文件系统上的文件执行此操作是没有问题的,我只需将其交给主xsd文件,所有内容都可以正常运行并解析所有xsd导入。我想要做的是将我的xsd嵌入到我的dll中,这样它就不会在文件系统上。具有嵌入式xsd文件的项目与将访问xsd文件以加载到DataSet的项目是分开的。

DataSet.ReadXmlSchema方法可以使用流,XmlReader,字符串uri或XmlTextReader。我没有问题加载DLL然后使用assembly.GetManifestResourceStream(schemaPath)到达主模式文件,如果我的模式只是一个文件,这将没有问题。问题是,一旦我将它传递给DataSet.ReadXmlSchema方法,它就无法找到任何导入。

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

关于如何使用导入到DataSet中加载嵌入式模式的任何想法?我最后的办法是暂时将嵌入的xsd文件复制到文件系统以创建DataSet然后删除它们,尽管我试图避免这种情况。

1 个答案:

答案 0 :(得分:2)

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

理由是在DataSet类的这个方法中:

internal void ReadXSDSchema(XmlReader reader, bool denyResolving)

代码编写的方式,它使用XmlSchemaSet;它使用您传递的阅读器(XmlReader)来加载模式,将其添加到XmlSchemaSet并进行编译。

不幸的是,要在使用嵌入式资源时编译XmlSchemaSet,一个必须为XmlSchemaSet对象提供一个xml解析器!...事实是,没有一个可以在那里使用指出这个过程。虽然阅读器设置可能配置了旋转变压器,但如您所知,它只是写入(没有吸气剂)。

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

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