将(嵌入式资源)架构添加到XmlReaderSettings而不是Filename?

我正在编写一个解析Xml文件的应用程序。 我有架构(.xsd)文件,我在尝试反序列化之前用它来validationXml:

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 / schemas / myschema.xsd“是.xsd相对于程序执行的路径。

我不想使用文件名/路径,而是宁愿将.xsd文件编译为我项目中的嵌入式资源(我已经添加了.xsd文件并将Build Action设置为Embedded Resource)。

我的问题是……如何将嵌入式资源架构添加到XmlReaderSettings架构列表中? settings.Schemas.Add有4种重载方法,但没有一种方法将嵌入资源作为参数。 它们都采用模式文件的路径。

我过去曾使用嵌入式资源来动态设置标签图像,所以我对使用嵌入式资源有些熟悉。 看看我的其他代码看起来我最终得到的是一个包含内容的Stream

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

我假设嵌入的.xsd也将作为流读入,所以这会缩小我的问题。 当我引用包含架构而不是文件名的流时,如何将架构添加到XmlReaderSettings?

您可以使用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); }