我在.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 没有XmlValidatingReader
或Http:
或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
,但仍然无法正常工作。
答案 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);
}
}
答案 1 :(得分:0)
在您的代码中添加以下行: 使用System.Linq;