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

时间:2019-11-27 13:43:56

标签: 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);

旧代码没有给出任何错误,但是新代码给出了The URI prefix is not recognized.的错误,我找不到settings.Schemas.Add()的这种行为的原因,因为它可以与{{1 }}。有人可以帮忙吗?

编辑:此处 schemaLocation 的值为“ res://somepath/Messages.xsd”。因为 schemaLocation 没有XmlValidatingReaderHttp:https://,所以这就是发生错误的原因。如何使用 XmlReaderSettings

添加具有这些值的架构

编辑2:由于此XSD是嵌入式资源,因此我在线找到了此场景的一些代码。我做了下面的代码更改。

local resource

此处,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

我已经从Visual Studio中将assemblyname.folder.Message.xsd设置为Message.xsd,但仍然无法正常工作。

2 个答案:

答案 0 :(得分:3)

问题来源

您认为自己-URI必须指向某个地方的REAL文件-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);
    }
}

source

答案 1 :(得分:0)

在您的代码中添加以下行: 使用System.Linq;