我的目标是将嵌入的 xsd 加载到数据集中,然后基于 xsd 生成表。
我正在尝试加载包含多个导入的 XSD 文件的 XML 架构的数据集。对文件系统上的文件执行此操作没有问题,我只需将主 xsd 文件交给它,一切都会正常加载,并且所有 xsd 导入都已解决。我想做的是将我的 xsd 嵌入到我的 dll 中,这样它就不会坐在文件系统上。具有嵌入式 xsd 文件的项目与将访问 xsd 文件以加载到数据集中的项目是分开的。
DataSet.ReadXmlSchema 方法可以采用流、XmlReader、字符串 uri 或 XmlTextReader。我加载 dll 并使用 assembly.GetManifestResourceStream(schemaPath) 访问主架构文件没有问题,如果我的架构只是一个文件,那就没问题了。问题是,一旦我将其传递给 DataSet.ReadXmlSchema 方法,它就无法找到任何导入。
我尝试使用 XmlReader 并将 XmlReaderSettings 对象与我为之前的问题编写的自定义 xml 解析器一起使用(并且我知道有效)。我过去曾使用自定义 xml 解析器将嵌入 dll 中的类似架构加载到 XmlSchemaSet 中,它的工作方式非常神奇。因此,当我进行 XmlReader.Create 调用时,我传入使用自定义 Xml Resolver 的 XmlReaderSettings,但是当我将此 XmlReader 传递给 DataSet.ReadXmlSchema 方法时,它也找不到导入的架构文件。我在重载的 GetEntity 方法中设置了一个断点,但它从未被命中。所以XmlReader似乎没有使用我提供的XmlResolver。我对 XmlTextReader 也有同样的问题。
关于如何将嵌入模式加载到数据集中,有什么想法吗?我的最后一招是将嵌入的 xsd 文件临时复制到文件系统以创建数据集,然后删除它们,尽管我试图避免这种情况。
最佳答案
不幸的是,不,无法从作为资源嵌入的多个 XSD 加载数据集。
理由就在 DataSet 类的这个方法中:
内部 void ReadXSDSchema(XmlReader reader, bool denyResolving)
代码的编写方式是使用 XmlSchemaSet ;它使用您传递的读取器 (XmlReader) 来加载架构,将其添加到 XmlSchemaSet 并编译。
不幸的是,要在使用嵌入式资源时编译 XmlSchemaSet,必须为 XmlSchemaSet 对象提供一个 xml 解析器!...问题是,没有一个可以用于此目的过程中的点。虽然读取器设置可以使用解析器进行配置,但如您所知,它是只写的(没有 getter)。
为了测试我所说的内容,请尝试从相同的嵌入式资源加载 XmlSchemaSet;您会注意到,无论您尝试什么,解析器都必须设置在 XmlSchemaset 级别,而不是 XmlReader 级别。
我建议你看一下异常堆栈,然后使用Reflector或者类似的东西看代码。如果您得出不同的结论,请分享。
关于c# - 将嵌入式 XSD 导入到 DataSet 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724043/