JavaTM 2 Platform
Standard Ed. 6

org.xml.sax.ext
介面 EntityResolver2

所有父級介面:
EntityResolver
所有已知實作類別:
DefaultHandler2

public interface EntityResolver2
extends EntityResolver

擴展的介面,用於將外部實體參考映射到輸入源,或用於提供缺少的外部子集。使用 XMLReader.setEntityResolver() 方法將此介面的實作提供給解析器。當解析器使用此介面中的方法時,將使用 EntityResolver2.resolveEntity() 方法(在此介面中)而不是 舊的 (SAX 1.0) EntityResolver.resolveEntity() 方法。

此模組(包括源程式碼和文檔)在公共域中,同時 沒有擔保

如果 SAX 應用程序需要此介面為外部實體定義的自定義處理,則必須確保使用 XMLReader,並將 http://xml.org/sax/features/use-entity-resolver2)功能標誌設置為 true(識別該功能時,是其預設值)。如果該標誌不可識別,或其值為 false,或解析器不能實作此介面,那麼僅使用 EntityResolver 方法。

它支持修改實體解析的三種類別別的應用程序。此介面對於舊式 應用程序是未知的;它們將提供 EntityResolver。由於多態性,轉換網要 提供了 EntityResolver2,並自動獲取在任何支持它的系統(解析器或其他工具)中方法的優點。舊式轉換網要 應用程序將與任何 SAX2 解析器一起工作。新式 應用程序將運行失敗,在支持此特定功能的 SAX2 解析器上運行除外。它們強調功能標誌應有值 "true",如果調用原始 SAX 1.0 式實體解析方法,則它們提供的 EntityResolver2 實作可能會拋出異常。

從以下版本開始:
SAX 2.0 (extensions 1.1 alpha)
另請參見:
XMLReader.setEntityResolver(org.xml.sax.EntityResolver)

方法摘要
 InputSource getExternalSubset(String name, String baseURI)
          允許應用程序為不能顯式定義外部子集的文檔提供外部子集。
 InputSource resolveEntity(String name, String publicId, String baseURI, String systemId)
          允許應用程序把對外部實體的參考映射到輸入源,或告知解析器它應使用常規 URI 解析。
 
從介面 org.xml.sax.EntityResolver 繼承的方法
resolveEntity
 

方法詳細資訊

getExternalSubset

InputSource getExternalSubset(String name,
                              String baseURI)
                              throws SAXException,
                                     IOException
允許應用程序為不能顯式定義外部子集的文檔提供外部子集。這樣,具有 DOCTYPE 宣告的忽略外部子集的文檔可以增加可供驗證、實體處理和屬性處理(標準化、預設和報告包括 ID 的型別)使用的宣告。通過 startDTD() 方法報告此增加,就像文檔文本最初就包括外部子集一樣;在報告任何內部子集資料或錯誤之前進行此回調。

此方法也可以與沒有 DOCTYPE 宣告的文檔一起使用。當遇到根元素,但沒有看到任何 DOCTYPE 宣告時,調用此方法。如果返回該外部子集的一個值,則宣告該根元素為根元素,條件是以其他方式在文檔序言結尾銜接 DOCTYPE 宣告無效。在該情況下,解析器回調序列邏輯上類似以下內容:

 ... comments and PIs from the prolog (as usual)
 startDTD ("rootName", source.getPublicId (), source.getSystemId ());
 startEntity ("[dtd]");
 ... declarations, comments, and PIs from the external subset
 endEntity ("[dtd]");
 endDTD ();
 ... then the rest of the document (as usual)
 startElement (..., "rootName", ...);
 

注意,InputSource 不能獲得進一步的解析。此方法的實作可能要調用 resolveEntity() 以獲得一些優點,如使用 DTD 實體的本地快取記憶體。另外,不包括外部參數實體的(非驗證)處理器永不使用此方法。

與 XML 處理器進行互操作時,此方法的使用包括簡化資料驗證,該處理器總是需要對外部實體的不合需要的網路存取,或者由於其他原因採用“非 DTD”策略。非驗證目的套件括強制文檔去包括 DTD,以便能一致地處理屬性。例如,XPath 處理器在它能夠處理廣泛使用的參考型別之前需要知道哪一個屬性具有型別 "ID"。

警告:返回外部子集能修改輸入文檔。通過為常規實體提供定義,能使格式錯誤的文檔看起來格式良好。

參數:
name - 標識文檔根元素。此名稱來自 DOCTYPE 宣告(如果可用),或來自實際的根元素。
baseURI - 文檔的基 URI,充當選擇外部子集的附加提示。這總是一個絕對 URI,除非由於向 XMLReader 提供了一個不帶 URI 的 InputSource 而使它為 null 時。
返回:
描述解析器使用的新外部子集的 InputSource 物件,或指示不提供任何外部子集的 null。
拋出:
SAXException - 任何 SAX 異常,可能包裹另外的異常。
IOException - 可能指示創建新的 InputStream 或 Reader 失敗,或非法 URL。

resolveEntity

InputSource resolveEntity(String name,
                          String publicId,
                          String baseURI,
                          String systemId)
                          throws SAXException,
                                 IOException
允許應用程序把對外部實體的參考映射到輸入源,或告知解析器它應使用常規 URI 解析。僅對已正確宣告的外部實體調用此方法。此方法提供比 EntityResolver 介面更多的靈活性,支持更複雜的目錄方案(例如 OASIS XML Catalogs 規範定義的目錄方案)的實作。

配置為使用此解析器方法的解析器將調用它,以確定用於由於 XML 文本中的參考而包括在內的任何外部實體的輸入源。它排除文檔實體和 getExternalSubset() 返回的任何外部實體。當通過使用功能標誌將(非驗證的)處理器配置為不包括實體(參數或常規)的類別時,不為此類別實體調用此方法。

注意,這裡使用的實體命名方案與 LexicalHandler 中或 ContentHandler.skippedEntity() 方法中使用的相同。

參數:
name - 標識正被解析的外部實體。外部子集的 "[dtd]",或者以 "%" 開頭用來指示參數實體的名稱,或者常規實體的名稱。在由 SAX2 解析器調用時,它永不能為 null。
publicId - 被參考的外部實體的公共標識符(按照 XML 規範的要求標準化),如果不提供任何內容,則為 null。
baseURI - 關於解釋哪個相對 systemID 的 URI。這總是一個絕對 URI,除非它為 null(可能因為向 XMLReader 提供了一個不帶 URI 的 InputSource)。XML 規範定義了此 URI,它是與開始相關宣告的 "<" 相關聯的 URI。
systemId - 參考的外部實體的系統標識符;相對 URI 或絕對 URI。由 SAX2 解析器調用時,它從不能為 null;此類別解析器僅解析宣告的實體和任何外部子集。
返回:
描述解析器使用的新輸入源的 InputSource 物件。返回 null 指示解析器基於基 URI 解析系統 ID,並打開到產生的 URI 的連接。
拋出:
SAXException - 任何 SAX 異常,可能包裹另外的異常。
IOException - 可能指示創建新的 InputStream 或 Reader 失敗,或非法 URL。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only