使用 XmlResolver 解析资源
XmlReader 类使用 XmlResolver 来解析外部 DTD、实体和架构。XmlReader 类默认使用不带用户凭据的 XmlUrlResolver。通过设置 XmlResolver 属性并将 XmlReaderSettings 对象传递给 Create 方法,可以指定要使用的 XmlResolver。
下面的代码创建一个 XmlReader 实例,该实例使用具有默认凭据的 XmlUrlResolver。
' Create a resolver with default credentials.
Dim resolver as XmlUrlResolver = new XmlUrlResolver()
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials
' Set the reader settings object to use the resolver.
settings.XmlResolver = resolver
' Create the XmlReader object.
Dim reader as XmlReader = XmlReader.Create("https://ServerName/data/books.xml", settings)
// Create a resolver with default credentials.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Set the reader settings object to use the resolver.
settings.XmlResolver = resolver;
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("https://ServerName/data/books.xml", settings);
// Create a resolver with default credentials.
XmlUrlResolver^ resolver = gcnew XmlUrlResolver;
resolver->Credentials = System::Net::CredentialCache::DefaultCredentials;
// Set the reader settings object to use the resolver.
settings->XmlResolver = resolver;
// Create the XmlReader object.
XmlReader^ reader = XmlReader::Create( L"https://ServerName/data/books.xml", settings );
如果 books.xml 文件包含外部 DTD,则 XmlReader 将按以下方式处理该外部 DTD。为解析 DTD,XmlReader 将调用 GetEntity 方法以获取实体的流表示形式。如果 DTD 的 URI 是相对 URI,则 XmlReader 将调用 ResolveUri 方法并返回给定 relativeUri 和 baseUri 的绝对 URI。如果 XmlUrlResolver 不知道如何解析给定的 URI,它将返回 null 引用。
GetEntity 方法使用 Credentials 属性中的适当信息以访问资源。出于安全考虑,没有针对此属性的 get 访问器。在重写 XmlResolver 时,GetEntity 方法利用 Credentials 属性中的凭据信息。
解析所有其他 XML 资源与解析 DTD 非常类似。XmlResolver 只需要知道如何与外部资源协商连接并返回内容的流表示形式。解释流的任务由调用 XmlResolver 的对象负责。