JavaTM 2 Platform
Standard Ed. 6

org.xml.sax.helpers
類別 NamespaceSupport

java.lang.Object
  繼承者 org.xml.sax.helpers.NamespaceSupport

public class NamespaceSupport
extends Object

封裝名稱空間邏輯,以便由使用 SAX 的應用程序使用,或由 SAX 驅動程序內部使用。

此模組(包括源程式碼和文檔)位於公共域中,對該模組不提供擔保有關更多資訊,請參閱http://www.saxproject.org

此類別封裝名稱空間處理的邏輯:它可以追蹤當前對每個上下文強制使用的宣告,並自動將限定的 XML 名稱處理為其名稱空間的一部分;它還可以反過來用於從名稱空間產生 XML qname。

名稱空間支持物件是可重用的,但是在每個Session之間必須調用 reset 方法。

下面是一個簡單的Session:

String parts[] = new String[3];
 NamespaceSupport support = new NamespaceSupport();

 support.pushContext();
 support.declarePrefix("", "http://www.w3.org/1999/xhtml");
 support.declarePrefix("dc", "http://www.purl.org/dc#");

 parts = support.processName("p", parts, false);
 System.out.println("Namespace URI: " + parts[0]);
 System.out.println("Local name: " + parts[1]);
 System.out.println("Raw name: " + parts[2]);

 parts = support.processName("dc:title", parts, false);
 System.out.println("Namespace URI: " + parts[0]);
 System.out.println("Local name: " + parts[1]);
 System.out.println("Raw name: " + parts[2]);

 support.popContext();
 

注意,對於多數元素不包含名稱空間宣告的使用情況,必須優化此類別:例如,如果對每個上下文都重複相同的前綴/URI 映射,則此類別將會產生某種程度的低效率。

雖然 SAX 驅動程序(解析器)可以選擇使用此類別來實作名稱空間處理,但是不要求它們這樣做。如果應用程序要使用名稱空間資訊,則它們必須追蹤名稱空間資訊本身。

從以下版本開始:
SAX 2.0

欄位摘要
static String NSDECL
          作為常數的名稱空間宣告 URI。
static String XMLNS
          作為常數的 XML 名稱空間 URI。
 
建構子摘要
NamespaceSupport()
          創建新的名稱空間支持物件。
 
方法摘要
 boolean declarePrefix(String prefix, String uri)
          宣告名稱空間前綴。
 Enumeration getDeclaredPrefixes()
          返回此上下文中宣告的所有前綴的列舉。
 String getPrefix(String uri)
          返回映射到名稱空間 URI 的前綴之一。
 Enumeration getPrefixes()
          返回所有前綴的列舉,其宣告在當前上下文中是活動的。
 Enumeration getPrefixes(String uri)
          返回給定 URI 的 所有前綴的列舉,給定 URI 的宣告在當前上下文中是活動的。
 String getURI(String prefix)
          尋找前綴,並獲取當前映射的名稱空間 URI。
 boolean isNamespaceDeclUris()
          如果將名稱空間宣告屬性放置到名稱空間中,則返回 true。
 void popContext()
          恢復到以前的名稱空間上下文。
 String[] processName(String qName, String[] parts, boolean isAttribute)
          declarePrefix() 處理完當前上下文中的所有宣告之後,處理原始 XML 限定名稱。
 void pushContext()
          開始新的名稱空間上下文。
 void reset()
          重設此名稱空間支持物件,以便重新使用。
 void setNamespaceDeclUris(boolean value)
          控制是否通過 processName() 將名稱空間宣告屬性放置到 NSDECL 名稱空間中。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

欄位詳細資訊

XMLNS

public static final String XMLNS
作為常數的 XML 名稱空間 URI。值是 http://www.w3.org/XML/1998/namespace,在 "Namespaces in XML" * 推薦標準中定義。

這是自動映射到 "xml" 前綴的名稱空間 URI。

另請參見:
常數欄位值

NSDECL

public static final String NSDECL
作為常數的名稱空間宣告 URI。值是 http://www.w3.org/xmlns/2000/,在 "Namespaces in XML" 推薦標準的向後相容勘誤表中定義。因為勘誤表晚於 SAX2,SAX2 預設為原始的推薦標準,並且通常不使用此 URI。

這是可以選擇應用到 xmlnsxmlns:* 屬性的名稱空間 URI,使用它宣告名稱空間。

從以下版本開始:
SAX 2.1alpha
另請參見:
setNamespaceDeclUris(boolean), isNamespaceDeclUris(), 常數欄位值
建構子詳細資訊

NamespaceSupport

public NamespaceSupport()
創建新的名稱空間支持物件。

方法詳細資訊

reset

public void reset()
重設此名稱空間支持物件,以便重新使用。

在為新的Session重用名稱空間支持物件之前,有必要調用此方法。如果要支持名稱空間宣告 URI,則還必須將標誌設置為非預設值。

另請參見:
setNamespaceDeclUris(boolean)

pushContext

public void pushContext()
開始新的名稱空間上下文。新的上下文將自動繼承其父上下文的宣告,但是它還將追蹤在此上下文中所做的宣告。

事件回調程式碼應對每個元素啟動一次新的上下文。這意味著已準備好在兩個位置中的任何一個位置調用它。對於不包括名稱空間宣告的元素,ContentHandler.startElement() 回調是正確的位置。對於具有此類別宣告的元素,它在第一個 ContentHandler.startPrefixMapping() 回調中完成。可以使用布林標誌追蹤是否已啟動上下文。當調用這些方法中的任何一個方法時,它會檢查該標誌以查看是否需要啟動新的上下文。如果是,它會啟動上下文,並設置標誌。在 ContentHandler.startElement() 設置標誌後,它總是清除該標誌。

通常,SAX 驅動程序會在每個 XML 元素的開始處推送新的上下文。然後,它們執行屬性上的第一個傳遞,以處理所有的名稱空間宣告,進行 ContentHandler.startPrefixMapping() 回調。然後,進行第二個傳遞,以便為所有屬性和元素名稱確定限定名稱空間的名稱。最後,ContentHandler.startElement() 回調的所有資訊都是可用的,這樣就可以完成。

名稱空間支持物件總是以已經有效的基本上下文開始:在此上下文中,僅宣告 "xml" 前綴。

另請參見:
ContentHandler, popContext()

popContext

public void popContext()
恢復到以前的名稱空間上下文。

通常,應在每個 XML 元素的結束處彈出上下文。彈出上下文後,恢復以前有效的所有名稱空間前綴映射。

彈出上下文後,不得嘗試宣告其他名稱空間前綴,除非首先推送另一個上下文。

另請參見:
pushContext()

declarePrefix

public boolean declarePrefix(String prefix,
                             String uri)
宣告名稱空間前綴。在參考前綴之前,必須對它們進行宣告。例如,SAX 驅動程序(解析器)將在下面兩個過程中掃瞄元素的屬性:第一個是名稱空間宣告,然後是第二個過程,它使用 processName() 根據(潛在預定義的)前綴解釋前綴。

此方法在當前名稱空間上下文中宣告前綴;在彈出此上下文之前,前綴仍保持有效,除非它在後代上下文中映像。

要宣告預設元素名稱空間,請使用空字元串作為前綴。

注意,在此資源庫中存在不對稱:即使宣告了預設元素名稱空間,getPrefix 也不會返回 "" 前綴。要檢查預設名稱空間,必須使用 getURI 顯式尋找它。存在此不對稱使尋找屬性名稱的前綴更容易,其中不允許預設的前綴。

參數:
prefix - 要宣告的前綴,或指示預設元素名稱空間的空字元串。這不能有值“xml”或“xmlns”。
uri - 與前綴關聯的名稱空間 URI。
返回:
如果前綴是合法的,則返回 true;否則,返回 false
另請參見:
processName(java.lang.String, java.lang.String[], boolean), getURI(java.lang.String), getPrefix(java.lang.String)

processName

public String[] processName(String qName,
                            String[] parts,
                            boolean isAttribute)
declarePrefix() 處理完當前上下文中的所有宣告之後,處理原始 XML 限定名稱。

此方法通過移除前綴,並在當前宣告的前綴之中尋找它來處理當前上下文中的原始 XML 限定名稱。返回值將是調用者提供的陣列,按以下方式填寫:

parts[0]
名稱空間 URI,如果沒有正在使用的,則為空字元串。
parts[1]
本地名稱(不帶前綴)。
parts[2]
最初的原始名稱。

將內部化陣列中的所有字元串。如果原始名稱具有沒有宣告的前綴,那麼返回值將為 null。

注意,處理屬性名稱與處理元素名稱不同:未加前綴的元素名稱將接收預設名稱空間(如果有),而未加前綴的屬性名稱將不接收。

參數:
qName - 要處理的 XML 限定名稱。
parts - 調用者提供的陣列,至少能夠保存三個成員。
isAttribute - 指示這是屬性名稱 (true) 或元素名稱 (false) 的標誌。
返回:
提供的陣列,它持有三個內部化字元串,表示名稱空間 URI(或空字元串)、本地名稱和 XML 限定名稱;如果存在未宣告的前綴,則返回 null。
另請參見:
declarePrefix(java.lang.String, java.lang.String), String.intern()

getURI

public String getURI(String prefix)
尋找前綴,並獲取當前映射的名稱空間 URI。

此方法尋找當前上下文中的前綴。對於預設名稱空間,使用空字元串 ("")。

參數:
prefix - 要尋找的前綴。
返回:
關聯的名稱空間 URI,如果此上下文中未宣告前綴,則返回 null。
另請參見:
getPrefix(java.lang.String), getPrefixes()

getPrefixes

public Enumeration getPrefixes()
返回所有前綴的列舉,其宣告在當前上下文中是活動的。這包括來自沒有被覆寫的父上下文的宣告。

註:如果存在預設前綴,則在此列舉中將不返回它;使用帶有參數 "" 的 getURI 檢查預設前綴。

返回:
前綴的列舉(永遠不為空)。
另請參見:
getDeclaredPrefixes(), getURI(java.lang.String)

getPrefix

public String getPrefix(String uri)
返回映射到名稱空間 URI 的前綴之一。

如果當前有多個前綴映射到同一 URI,則此方法將進行任意選擇;如果需要所有前綴,則改用 getPrefixes() 方法。

註:這將永不返回空(預設)前綴;要檢查預設前綴,請使用帶有參數 "" 的 getURI 方法。

參數:
uri - 名稱空間 URI
返回:
當前映射到所提供的 URI 的前綴之一,如果沒有映射內容,或者將 URI 分派到預設名稱空間,則返回 null
另請參見:
getPrefixes(java.lang.String), getURI(java.lang.String)

getPrefixes

public Enumeration getPrefixes(String uri)
返回給定 URI 的 所有前綴的列舉,給定 URI 的宣告在當前上下文中是活動的。這包括來自沒有被覆寫的父上下文的宣告。

此方法返回映射到特定名稱空間 URI 的前綴。將包括前綴:xml。如果僅需要映射到名稱空間 URI 的一個前綴,並且不關心獲取哪一個前綴,請改用 getPrefix 方法。

註:此列舉中永不 套件括空的(預設)前綴;要檢查是否存在預設名稱空間,請使用帶有參數 "" 的 getURI 方法。

參數:
uri - 名稱空間 URI。
返回:
前綴的列舉(永不為空)。
另請參見:
getPrefix(java.lang.String), getDeclaredPrefixes(), getURI(java.lang.String)

getDeclaredPrefixes

public Enumeration getDeclaredPrefixes()
返回此上下文中宣告的所有前綴的列舉。

此列舉中將包括空的(預設)前綴;注意,此行為與 getPrefix(java.lang.String)getPrefixes() 的行為不同。

返回:
此上下文中宣告的所有前綴的列舉。
另請參見:
getPrefixes(), getURI(java.lang.String)

setNamespaceDeclUris

public void setNamespaceDeclUris(boolean value)
控制是否通過 processName() 將名稱空間宣告屬性放置到 NSDECL 名稱空間中。在推送任何上下文之前,這是唯一可更改的。

拋出:
IllegalStateException - 當推送任何上下文之後嘗試設置它時。
從以下版本開始:
SAX 2.1alpha

isNamespaceDeclUris

public boolean isNamespaceDeclUris()
如果將名稱空間宣告屬性放置到名稱空間中,則返回 true。此行為不是預設的行為。

從以下版本開始:
SAX 2.1alpha

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

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