2013-01-06 18 views
5

我正在編寫一個解析Xml文件的應用程序。我有我使用嘗試反序列化之前驗證XML的模式(.xsd)文件:將(嵌入式資源)架構添加到XmlReaderSettings而不是文件名?

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, "./xml/schemas/myschema.xsd"); 
settings.ValidationType = ValidationType.Schema; 
XmlReader reader = XmlReader.Create(xmlFile, settings); 
XmlDocument document = new XmlDocument(); 
document.Load(reader); 
ValidationEventHandler eventHandler = new ValidationEventHandler(settings_ValidationEventHandler); 
document.Validate(eventHandler); 

注意,參數*/XML /模式/ myschema.xsd」是路徑。 xsd相對於程序執行

我不想使用文件名/路徑,而是我寧願編譯.xsd文件作爲我的項目中的嵌入式資源(我已經添加了.xsd文件並將Build行動到嵌入式資源)

我的問題是....如何將嵌入式資源架構添加到XmlReaderSettings架構列表?有4重載的方法settings.Schemas.Add但它們都沒有將嵌入資源作爲參數。他們都採取模式文件的路徑。

我以前使用嵌入式資源來動態設置標籤圖像,所以我對使用嵌入式資源有些熟悉。看着我的其他代碼,它看起來像什麼,我終於結束了是包含內容:

System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
Stream myStream = myAssembly.GetManifestResourceStream(resourceName); 

我假設,嵌入式的.xsd也將作爲流所以這縮小閱讀下來我的問題了一下。當我引用包含模式的流而不是文件名時,如何將模式添加到XmlReaderSettings?

+0

不同於論壇的網站,我們不不要使用「謝謝」或「任何幫助表示讚賞」,或在[所有]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts)。 –

+0

好的沒問題。 –

回答

13

可以使用Add()重載需要一個XmlReader作爲其第二個參數:

Assembly myAssembly = Assembly.GetExecutingAssembly(); 
using (Stream schemaStream = myAssembly.GetManifestResourceStream(resourceName)) { 
    using (XmlReader schemaReader = XmlReader.Create(schemaStream)) { 
    settings.Schemas.Add(null, schemaReader); 
    } 
} 

或者你可以先加載架構,然後將其添加:

Assembly myAssembly = Assembly.GetExecutingAssembly(); 
using (Stream schemaStream = myAssembly.GetManifestResourceStream(resourceName)) { 
    XmlSchema schema = XmlSchema.Read(schemaStream, null); 
    settings.Schemas.Add(schema); 
} 
相關問題