首页 文章

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

提问于
浏览
2

我的目标是将带有导入的嵌入式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 回答

  • 2

    遗憾的是,不可以从作为资源嵌入的多个XSD加载DataSet .

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

    internal void ReadXSDSchema(XmlReader reader, bool denyResolving)

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

    不幸的是,要在使用嵌入式资源时编译XmlSchemaSet,一个 must 为XmlSchemaSet对象提供了一个xml解析器!......事实是,没有't one that can be used at that point in the process. While the reader settings may be configured with a resolver, as you know, it is Write only (there'没有getter) .

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

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

相关问题