gpt4 book ai didi

c# - XmlReaderSettings.Schemas.Add() : The URI prefix is not recognized

转载 作者:行者123 更新时间:2023-12-01 16:35:59 25 4
gpt4 key购买 nike

我在 .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 recognize. 我找不到 settings.Schemas 出现此行为的原因.Add(),因为它与 XmlValidatingReader 配合得很好。谁能帮忙解决这个问题吗?

编辑:这里 schemaLocation 的值为“res://somepath/Messages.xsd”。因为 schemaLocation 没有 Http:https:// 或者不是本地资源,这就是错误的原因正在发生。如何使用 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 的值为 null。 resourceName1 的值为 assemblyname.folder.Message.xsd

我已从 Visual Studio 将 Message.xsd 制作为嵌入式资源,但仍然无法正常工作。

最佳答案

问题来源

正如您所想 - URI 必须指向某处的真实文件 - 要么是 URL (HTTP/HTTPS) 要么是本地文件 ("C:\...")。

因此,如果您更喜欢使用嵌入式资源,则需要使用以下形式的完整指定路径:“命名空间.文件夹名称.文件名.扩展名”

示例

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

source

关于c# - XmlReaderSettings.Schemas.Add() : The URI prefix is not recognized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com