c# - XmlReaderSettings.Schemas.Add() :无法识别 URI 前缀
问题描述
我在 .Net 4.5 中升级了我的旧应用程序。有一些过时的方法警告我很想解决它们。过时的方法之一是 XmlValidatingReader。在网上查了一下,发现XmlReaderSettings是 XmlValidatingReader 的潜在替代品。
// ==old code==
Hashtable _SchemasCache = new Hashtable();
XmlReader xmlReader = new XmlTextReader(xmlStream);
XmlValidatingReader validatingReader = new XmlValidatingReader(xmlReader);
validatingReader.Schemas.Add(root.Namespace, schemaLocation); // both parametres are string. No error
_SchemasCache.Add(schemaLocation, validatingReader.Schemas);
// ==new code==
var schemaLocation = "res://somepath/Messages.xsd";
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(root.Namespace, schemaLocation); // this line gives error
_SchemasCache.Add(schemaLocation, settings.Schemas);
旧代码没有给出任何错误,但新代码给出了一个错误,The URI prefix is not recognized.
我找不到这种行为的原因settings.Schemas.Add()
,因为它与XmlValidatingReader
. 有人能帮忙吗?
编辑:这里schemaLocation的值是“res://somepath/Messages.xsd”。因为 schemaLocation没有Http:
或https://
没有 a local resource
,这就是发生错误的原因。如何使用XmlReaderSettings添加具有这些值的架构
编辑 2:由于这个 XSD 是一个嵌入式资源,我在网上找到了一些适用于这个场景的代码。我做了以下代码更改。
Assembly asm = Assembly.Load("AssemblyNameWhereXSDis");
Uri uri = new Uri(@"res://p.a.t.h/Autorisatie/Messages.xsd");
string resourceName1 = asm.GetName().Name + uri.AbsolutePath.Replace("/", ".");
using (Stream schemaStream = myAssembly.GetManifestResourceStream(resourceName1))
{
using (XmlReader schemaReader = XmlReader.Create(schemaStream)) // this line gives error : value(schemaStream) cannot be null
{
settings.Schemas.Add(root.Namespace, schemaReader);
}
}
这里, 的值为schemaStream
空。的resourceName1
值为assemblyname.folder.Message.xsd
。
我Message.xsd
是Embedded Resource
从 Visual Studio 制作的,但仍然无法正常工作。
解决方案
问题来源
正如您自己想象的那样 - URI 必须指向某个地方的真实文件 - URL ( HTTP/HTTPS
) 或本地文件 ( "C:\..."
)。
因此,如果您更喜欢使用嵌入式资源,则需要使用以下形式的完全指定的路径:
"Namespace.FolderName.Filename.Extension"
例子
using System;
using System.Linq;
using System.Reflection;
using System.Xml;
// ...
// get full resourceName from current assembly using Linq
var messagesResourceFullName = Assembly.GetExecutingAssembly()
.GetManifestResourceNames()
.Where(n => n.EndsWith("Messages.xsd"));
using (var schemaStream = asm.GetManifestResourceStream(messagesResourceFullName))
{
if (schemaStream == null) throw new FileNotFoundException();
using (var schemaReader = XmlReader.Create(schemaStream))
{
settings.Schemas.Add(root.Namespace, schemaReader);
}
}
推荐阅读
- ruby-on-rails - Ruby on Rails - 在某些字段验证失败后丢失表单值
- sapper - 预加载不会在导入到 _layout 的组件上运行
- excel - 在公式行中查找/搜索
- javascript - Google 表格数据应用程序脚本未在 WebApps 中显示值
- git - Heroku - 如何更新现有的 Heroku 应用程序?
- python - pyqt5 的颜色下拉选择器
- drupal-8 - drupal 8 不能在我的函数中使用其他类
- c++ - 来自 time.h 的 time() 是单调的吗?
- python - 合并xml文件中具有共同标签的元素
- json - 是否可以在逻辑应用程序中使用 Liquid Transform 将 Json 块分配给另一个 Json