【问题标题】:Adding (Embedded Resource) Schema To XmlReaderSettings Instead Of Filename?将(嵌入式资源)架构添加到 XmlReaderSettings 而不是文件名?
【发布时间】:2012-12-20 12:59:12
【问题描述】:

我正在编写一个解析 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);

请注意,参数 *./xml/schemas/myschema.xsd" 是 .xsd 相对于程序执行的路径。

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

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

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

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

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

【问题讨论】:

标签: c# xml validation xsd embedded-resource


【解决方案1】:

您可以使用将XmlReader 作为第二个参数的Add() 重载:

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);
}

【讨论】:

  • “resourceName”的值是多少?它会是 XSD 的路径吗?像“res://path/filename.xsd”?
  • 确保将您的资源设置为“EmbeddedResource”,而不仅仅是“Resource”或“Content”,然后您的 resourceName 将是您的命名空间、资源目录和文件名,所有这些都用点连接。例如我的项目是“Hello.World”,我的资源是“Resources\Foo.Bar.xsd”,resouceName 是“Hello.World.Resources.Foo.Bar.xsd”
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多