XmlReaderSettings.Schemas.Add():URI 前缀无法识别

Din*_*ire 5 c# asp.net xsd xmlreader obsolete

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

旧代码没有给出任何错误,但新代码给出了一个错误,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,的值为schemaStream空。和值resourceName1assemblyname.folder.Message.xsd

Message.xsdEmbedded Resource从 Visual Studio 制作的,但仍然无法正常工作。

its*_*sho 3

问题来源

正如您所想到的 - 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

来源