解析外部資源

XmlDocument 類別可以使用 XmlDocumentXmlResolver 屬性尋找沒有內嵌到 XML 資料的資源,例如外部文件類型定義 (DTD)、實體和結構描述。 這些項目可位於網路或本機磁碟上,並且可以由統一資源識別元 (URI) 辨識。 如此可讓 XmlDocument 解析文件中出現的 EntityReference 節點,並依據外部 DTD 或結構描述驗證文件。

完全信任的 XmlDocument

XmlResolver 屬性會影響 XmlDocument.Load 方法的功能。 下表顯示,在 XmlDocument 物件是完全受信任時,XmlDocument.XmlResolver 屬性將會如何運作。 下表說明當 Load 的輸入為 TextReaderStringStreamURI 時的 XmlDocument.Load 方法。 如果 XmlDocument 是從 XmlReader 載入,則這個表格不適用於 Load 方法。

XmlResolver 屬性 函式 備註
屬性設定為之前已建立的 XmlResolver 類別,而這個類別已經有由使用者設定好的屬性。 XmlDocument 使用的 XmlResolver,是指定用來解析檔案名稱、解析外部資源的參考 (例如 DTD、實體和結構描述)。

當解析在加入或編輯 XmlDocument 中節點必要的外部資源時,也會使用 XmlResolver
每當您要尋找並解析外部資源時,就必須使用指定給 XmlDocumentXmlResolver 解析程式。
屬性會設定為 null (在 Microsoft Visual Basic .NET中則為 Nothing)。 不支援需要外部資源的功能,例如尋找外部結構描述或 DTD。 也不會解析外部實體,並且也不支援執行編輯功能 (例如插入需要解析的實體節點)。 XmlDocument 將檔案以匿名載入,並且不會嘗試解析任何其他的資源。
尚未設定屬性,但是保留為預設狀態。 在解析檔案名稱、尋找外部 DTD、實體和結構描述時,帶有 NULL 認證的 XmlUrlResolver 會被具現化,並且被 XmlDocument 使用,同時在編輯節點時會使用 null 認證。

下表說明當 Load 的輸入是 XmlReader,且 XmlDocument 是完全受信任時的 XmlDocument.Load 方法。

XmlResolver 屬性 函式 備註
XmlDocument 使用的 XmlResolver 類別與 XmlReader 使用的類別相同。 XmlDocument 使用指定給 XmlReaderXmlResolver

因為 XmlDocument.Resolver 是從 XmlReader 取得 XmlResolver,所以不論 XmlDocument 的信任層級為何,其屬性都無法設定。 您無法藉由設定 XmlDocumentXmlResolver 屬性,來覆寫 XmlReaderXmlResolver 的設定。
XmlReader 可能是 XmlTextReaderXmlValidatingReader 或自訂撰寫的讀取器。 如果所用的讀取器支援實體解析,則會解析外部實體。 如果傳遞的讀取器不支援實體參考,則不會解析實體參考。

非完全信任的 XmlDocument

下表顯示當物件是非完全信任時,XmlDocument.XmlResolver 屬性如何運作。 當 Load 的輸入為 TextReaderStringStreamURI 時,此表格即適用於 XmlDocument.Load 方法。 如果 XmlDocument 是從 XmlReader 載入,則這個表格不適用於 Load 方法。

XmlResolver 屬性 函式 備註
在非完全信任的案例中,XmlResolver 屬性只能設定為 Null。 在解析檔案名稱、尋找外部 DTD、實體和結構描述時,帶有 null 認證的 XmlUrlResolver 會被具現化,並且被 XmlDocument 使用,同時在編輯節點時會使用 null 認證。 這個行為和 XmlResolver 屬性沒有設定並保留為預設狀態時的行為相同。

XmlDocument 使用匿名權限執行所有的動作。
屬性會設定為 null (在 Microsoft Visual Basic .NET中則為 Nothing)。 不支援需要外部資源的功能,例如尋找外部結構描述或 DTD。 也不會解析外部實體,並且也不支援執行編輯功能,例如插入需要資源的實體節點。 若屬性是 null,則不論 XmlDocument 是完全受信任或非完全受信任,都會有相同的行為。
尚未設定屬性,但是保留為預設狀態。 在解析檔案名稱、尋找外部 DTD、實體和結構描述時,帶有 null 認證的 XmlUrlResolver 會被具現化,並且被 XmlDocument 使用,同時在編輯節點時會使用 null 認證。 XmlDocument 使用匿名權限執行所有的動作。

Load 的輸入為 XmlReader 並且 XmlDocument 是非完全信任時,這個表格適用於 XmlDocument.Load 方法。

XmlResolver 屬性 函式 備註
XmlDocument 使用的 XmlResolver 類別與 XmlReader 使用的類別相同。 XmlDocument 使用指定給 XmlReaderXmlResolver

因為 XmlDocument.Resolver 是從 XmlReader 取得 XmlResolver,所以不論 XmlDocument 的信任層級為何,其屬性都無法設定。 您無法藉由設定 XmlDocumentXmlResolver 屬性,來覆寫 XmlReaderXmlResolver 的設定。
XmlReader 可以是 XmlTextReader、驗證的 XmlReader 或自訂撰寫的讀取器。 如果所用的讀取器支援實體解析,則會解析外部實體。 如果傳遞的讀取器不支援實體參考,則不會解析實體參考。

設定 XmlResolver 使其含有正確的認證,即可存取外部資源。

注意

您無法擷取 XmlResolver 屬性。 這有助於防止使用者重複使用已經在其上設定安全性認證的 XmlResolver。 此外,若使用 XmlTextReader 或驗證的 XmlReader 來載入 XmlDocument,且 XmlDocument 具有已經設定的解析程式,則 XmlDocumentLoad 階段之後將不會快取這些讀取器的解析程式,因為這也會帶來安全性方面的風險。

如需詳細資訊,請參閱 XmlResolver 參考頁面的<備註>一節。

另請參閱