XmlUrlResolver 类

定义

解析由统一资源标识符 (URI) 命名的外部 XML 资源。

public ref class XmlUrlResolver : System::Xml::XmlResolver
public class XmlUrlResolver : System.Xml.XmlResolver
type XmlUrlResolver = class
    inherit XmlResolver
Public Class XmlUrlResolver
Inherits XmlResolver
继承
XmlUrlResolver

示例

以下示例创建一个 XmlReader 使用默认凭据的 XmlUrlResolver 凭据。


// Create an XmlUrlResolver with default credentials.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = CredentialCache.DefaultCredentials;

// Create the reader.
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
XmlReader reader =
     XmlReader.Create("http://serverName/data/books.xml", settings);
' Create an XmlUrlResolver with default credentials.
Dim resolver As New XmlUrlResolver()
resolver.Credentials = CredentialCache.DefaultCredentials

' Create the reader.
Dim settings As New XmlReaderSettings()
settings.XmlResolver = resolver
Dim reader As XmlReader = _
   XmlReader.Create("http://serverName/data/books.xml", settings)

注解

XmlUrlResolver 用于解析外部 XML 资源,例如实体、文档类型定义 (DTD) 或架构。 它还用于处理在可扩展样式表语言 (XSL) 样式表或 XML 架构定义语言 (XSD) 架构中找到的元素。

XmlUrlResolver 是命名空间中 System.Xml 所有类的默认解析程序。 它支持 file://http:// 协议以及来自 WebRequest 类的请求。

重要

XmlUrlResolver 对象可以包含敏感信息,例如用户凭据。 缓存 XmlUrlResolver 对象时应小心,不应将对象传递给 XmlUrlResolver 不受信任的组件。

解析 DTD

如果 XML 读取器 () XmlReader 读取包含外部 DTD 的 XML 文件,则会调用 XmlUrlResolver.GetEntityAsync 该方法以获取 DTD 的流表示形式。 如果 DTD 的 URI 是相对 URI,则 XML 读取器将调用该方法 XmlUrlResolver.ResolveUri 并返回给定 relativeUribaseURi 参数的绝对 URI。 XmlUrlResolver如果不知道如何解析 URI,它将返回null

XmlUrlResolver.GetEntity 方法使用 Credentials 属性中的适当信息以访问资源。 出于安全原因,此属性没有 get 访问器。 覆盖 XmlResolver时, GetEntity 是利用 Credentials 属性中的凭据信息的方法。

解析所有其他 XML 资源与解析 DTD 非常类似。 XmlResolver 协商与外部资源的连接,并返回 Stream 内容的表示形式。 正在调用解释 XmlResolver 流的对象。

扩展 XmlUrlResolver 类

XmlUrlResolver 类的默认行为是从其源而不是缓存中解析 XML 数据资源。 在某些情况下,从缓存解析数据资源可以节省到数据资源的行程,因而可提高应用程序的性能。 这种性能增益必须针对最新内容需要加以权衡。

以下示例扩展 XmlUrlResolver 并生成一个新类, XmlCachingResolver以从缓存中检索资源。 这是通过重写 XmlUrlResolver.Credentials 属性和 XmlUrlResolver.GetEntity 方法来完成的。

class XmlCachingResolver : XmlUrlResolver
{
    bool enableHttpCaching;
    ICredentials credentials;

    //resolve resources from cache (if possible) when enableHttpCaching is set to true
    //resolve resources from source when enableHttpcaching is set to false
    public XmlCachingResolver(bool enableHttpCaching)
    {
        this.enableHttpCaching = enableHttpCaching;
    }

    public override ICredentials Credentials
    {
        set
        {
            credentials = value;
            base.Credentials = value;
        }
    }

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        if (absoluteUri == null)
        {
            throw new ArgumentNullException("absoluteUri");
        }
        //resolve resources from cache (if possible)
        if (absoluteUri.Scheme == "http" && enableHttpCaching && (ofObjectToReturn == null || ofObjectToReturn == typeof(Stream)))
        {
            WebRequest webReq = WebRequest.Create(absoluteUri);
            webReq.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
            if (credentials != null)
            {
                webReq.Credentials = credentials;
            }
            WebResponse resp = webReq.GetResponse();
            return resp.GetResponseStream();
        }
        //otherwise use the default behavior of the XmlUrlResolver class (resolve resources from source)
        else
        {
            return base.GetEntity(absoluteUri, role, ofObjectToReturn);
        }
    }
}
Class XmlCachingResolver
    Inherits XmlUrlResolver
    Dim enableHttpCaching As Boolean
    Public Shadows Credentials As ICredentials

    'resolve resources from cache (if possible) when enableHttpCaching is set to true
    'resolve resources from source when enableHttpcaching is set to false
    Public Sub New(ByVal enableHttpCaching As Boolean)
        Me.enableHttpCaching = enableHttpCaching
    End Sub

    Public Shadows Function GetEntity(ByVal absoluteUri As Uri, ByVal role As String, ByVal returnType As Type) As Object
        If absoluteUri = Nothing Then
            Throw New ArgumentNullException("absoluteUri")
        End If

        'resolve resources from cache (if possible)
        If absoluteUri.Scheme = "http" And enableHttpCaching And (returnType Is GetType(Nullable) Or returnType Is GetType(Stream)) Then
            Dim webReq As WebRequest = WebRequest.Create(absoluteUri)
            webReq.CachePolicy = New HttpRequestCachePolicy(HttpRequestCacheLevel.Default)
            If Not (Credentials Is Nothing) Then
                webReq.Credentials = Credentials
            End If
            Dim resp As WebResponse = webReq.GetResponse()
            Return resp.GetResponseStream()
            'otherwise use the default behavior of the XmlUrlResolver class (resolve resources from source)
        Else
            Return MyBase.GetEntity(absoluteUri, role, returnType)
        End If

    End Function
End Class

XmlCachingResolver 类的缓存行为在 GetEntity 方法中实现。 这是通过创建新的 WebRequestHttpRequestCachePolicy 对象来完成的。 HttpRequestCachePolicy 对象是使用 Default 枚举的 HttpRequestCacheLevel 成员创建的。

使用 CachePolicy 对象设置 WebRequest 对象的 HttpRequestCachePolicy 属性。

An instance of the XmlCachingResolver class is created with the Boolean enableHttpCaching. 如果设置为此值 true,则实例会从默认缓存解析资源(如果可能)。 false设置为 时enableHttpCaching,实例使用默认行为并从其源解析资源。

备注

此示例利用.NET Framework中 XML 类的扩展性。 可以扩展和自定义其他类以满足特定应用程序的需要。

构造函数

XmlUrlResolver()

初始化 XmlUrlResolver 类的新实例。

属性

CachePolicy

获取或设置基础 WebRequest 对象的缓存策略。

Credentials

设置用于对 Web 请求进行身份验证的凭据。

Proxy

获取或设置基础 WebRequest 对象的网络代理。

方法

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
GetEntity(Uri, String, Type)

将 URI 映射到包含实际资源的对象。

GetEntityAsync(Uri, String, Type)

将 URI 异步映射到包含实际资源的对象。

GetEntityAsync(Uri, String, Type)

将 URI 异步映射到包含实际资源的对象。

(继承自 XmlResolver)
GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
ResolveUri(Uri, String)

从基 URI 和相对 URI 解析绝对 URI。

ResolveUri(Uri, String)

当在派生类中被重写时,从基 URI 和相对 URI 解析绝对 URI。

(继承自 XmlResolver)
SupportsType(Uri, Type)

使解决程序能够返回 Stream 以外的类型。

(继承自 XmlResolver)
ToString()

返回表示当前对象的字符串。

(继承自 Object)

适用于

另请参阅