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

Jan*_*cci 8 c# xml validation xsd embedded-resource

我正在编写一个解析Xml文件的应用程序.我有架构(.xsd)文件,我用它来验证Xml,然后再尝试反序列化它:

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);
Run Code Online (Sandbox Code Playgroud)

请注意,参数*./ 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);
Run Code Online (Sandbox Code Playgroud)

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

MiM*_*iMo 17

您可以使用Add()带有XmlReader第二个参数的重载:

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

或者您可以先加载架构然后添加它:

Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(resourceName)) {
  XmlSchema schema = XmlSchema.Read(schemaStream, null);
  settings.Schemas.Add(schema);
}
Run Code Online (Sandbox Code Playgroud)

  • 确保将资源设置为“EmbeddedResource”,而不仅仅是“资源”或“内容”,然后您的资源名称将是您的命名空间、资源目录和文件名,全部用点连接。例如,我的项目是“Hello.World”,我的资源是“Resources\Foo.Bar.xsd”,resouceName 将是“Hello.World.Resources.Foo.Bar.xsd” (2认同)