添加(嵌入式资源)架构到XmlReaderSettings而不是文件名
本文关键字:XmlReaderSettings 文件名 嵌入式 资源 添加 | 更新日期: 2023-09-27 17:50:47
我正在编写一个解析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有4个重载方法。添加,但它们都不接受嵌入式资源作为参数。它们都采用模式文件的路径。我过去使用嵌入式资源来动态设置标签图像,所以我对使用嵌入式资源有点熟悉。看看我的其他代码,看起来我最终得到的是一个流,它包含以下内容:
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
Stream myStream = myAssembly.GetManifestResourceStream(resourceName);
我假设嵌入的。xsd也将作为流读入,因此这缩小了我的问题的范围。当我有对包含模式而不是文件名的流的引用时,如何将模式添加到XmlReaderSettings ?
您可以使用以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);
}