2012-03-15 72 views
2

我的目標是將導入的嵌入式xsd加載到DataSet中,然後根據xsd生成表格。將導入的嵌入式XSD加載到數據集中

我正在嘗試加載一個DataSet與由多個導入的XSD文件組成的XML Schema。對文件系統中的文件執行此操作是沒有問題的,我只需將它交給主要的xsd文件,並且一切正常,所有xsd導入都已解析。我想要做的是將我的xsd嵌入到我的dll中,這樣它就不會坐在文件系統上。具有嵌入式xsd文件的項目與將要訪問要加載到DataSet中的xsd文件的項目是分開的。

DataSet.ReadXmlSchema方法可以採用流,XmlReader,string 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相同的問題。

關於如何將導入的嵌入式模式加載到DataSet中的任何想法?我最後的手段是臨時將嵌入式xsd文件複製到文件系統以創建DataSet,然後將其刪除,儘管我試圖避免這種情況。

回答

2

不幸的是,不可能從多個嵌入爲資源的XSD中加載DataSet。

的理由是在DataSet類的這個方法:

internal void ReadXSDSchema(XmlReader reader, bool denyResolving)

代碼被寫入那裏的方式,它利用一個XmlSchemaSet的;它使用您傳遞的讀取器(XmlReader)來加載模式,將其添加到XmlSchemaSet並編譯。

不幸的是,使用嵌入資源時,編譯XmlSchemaSet中,一個必須提供的XML解析器來XmlSchemaSet中的對象!......事情是,沒有一個能夠在該點的過程中使用。如您所知,閱讀器設置可能使用解析器進行配置,但它是隻寫(沒有getter)。

要測試我所說的,嘗試從相同的嵌入式資源加載XmlSchemaSet;您會注意到無論您嘗試什麼,解析器都必須設置在XmlSchemaset級別,而不是XmlReader級別。

我建議你看看異常堆棧,然後使用Reflector或類似的東西來看看代碼。如果您得出不同的結論,請分享。

+0

不幸的是,我認爲你是對的。感謝您的驗證。 – user817722 2012-03-19 15:14:51