public class NamespaceSupport
extends Object
java.lang.Object | |
↳ | org.xml.sax.helpers.NamespaceSupport |
封装名称空间逻辑以供使用SAX的应用程序使用,或由SAX驱动程序内部使用。
This module, both source code and documentation, is in the Public Domain, and comes with NO WARRANTY. See http://www.saxproject.org for further information.
这个类封装了命名空间处理的逻辑:它跟踪当前对每个上下文有效的声明并自动处理合格的XML名称到它们的命名空间部分; 它也可以反过来用于从命名空间生成XML qname。
名称空间支持对象是可重用的,但必须在每个会话之间调用重置方法。
这是一个简单的会议:
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驱动程序(解析器)可能选择使用此类来实现名称空间处理,但它们不需要这样做。 如果应用程序想要使用名称空间信息,它们必须自己跟踪名称空间信息。
Constants |
|
---|---|
String |
NSDECL 名称空间声明URI作为常量。 |
String |
XMLNS XML名称空间URI作为常量。 |
Public constructors |
|
---|---|
NamespaceSupport() 创建一个新的名称空间支持对象。 |
Public methods |
|
---|---|
boolean |
declarePrefix(String prefix, String uri) 声明一个名称空间前缀。 |
Enumeration |
getDeclaredPrefixes() 返回在此上下文中声明的所有前缀的枚举。 |
String |
getPrefix(String uri) 返回映射到名称空间URI的前缀之一。 |
Enumeration |
getPrefixes() 返回在当前上下文中声明为活动的所有前缀的枚举。 |
Enumeration |
getPrefixes(String uri) 返回在当前上下文中声明为活动的给定URI的所有前缀的枚举。 |
String |
getURI(String prefix) 查找前缀并获取当前映射的名称空间URI。 |
boolean |
isNamespaceDeclUris() 如果名称空间声明属性放置在名称空间中,则返回true。 |
void |
popContext() 恢复到以前的命名空间上下文。 |
String[] |
processName(String qName, String[] parts, boolean isAttribute) 在当前上下文中的所有声明已由 |
void |
pushContext() 启动一个新的名称空间上下文。 |
void |
reset() 重置此名称空间支持对象以供重用。 |
void |
setNamespaceDeclUris(boolean value) 控制是否通过 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
String NSDECL
名称空间声明URI作为常量。 值为http://www.w3.org/xmlns/2000/
,如在“XML中的名称空间”建议中向后不兼容的勘误中所定义的。 由于该纠错后期SAX2,SAX2默认为原始建议,并且通常不使用此URI。
这是可选应用于 xmlns和 xmlns:*属性的名称空间URI,用于声明名称空间。
常量值:“http://www.w3.org/xmlns/2000/”
String XMLNS
XML名称空间URI作为常量。 值为http://www.w3.org/XML/1998/namespace
如“XML中的命名空间”*的建议中所定义的。
这是自动映射到“xml”前缀的名称空间URI。
常量值:“http://www.w3.org/XML/1998/namespace”
boolean declarePrefix (String prefix, String uri)
声明一个名称空间前缀。 所有前缀必须在引用之前声明。 例如,一个SAX驱动程序(解析器)会以processName()
扫描一个元素的属性:第一次用于名称空间声明,然后第二次使用processName()
解释针对前缀(可能被重新定义)的前缀。
此方法在当前命名空间上下文中声明一个前缀; 前缀将保持有效直到弹出该上下文,除非它在后代上下文中被映射。
要声明默认元素名称空间,请使用空字符串作为前缀。
请注意,在推送并弹出另一个名称空间上下文后,您 不得声明前缀,或者通过处理前缀名称将声明阶段视为完整。
请注意,此库中存在不对称情况:即使您声明了默认元素名称空间, getPrefix
也不会返回该前缀。 要检查默认名称空间,必须使用getURI
明确查找它。 这种不对称的存在使得查找属性名称的前缀变得更加容易,其中默认前缀是不允许的。
Parameters | |
---|---|
prefix |
String : The prefix to declare, or the empty string to indicate the default element namespace. This may never have the value "xml" or "xmlns". |
uri |
String : The Namespace URI to associate with the prefix. |
Returns | |
---|---|
boolean |
true if the prefix was legal, false otherwise |
Enumeration getDeclaredPrefixes ()
返回在此上下文中声明的所有前缀的枚举。
这个枚举中将包含空的(默认)前缀; 请注意,此行为不同于getPrefix(String)
和getPrefixes()
。
Returns | |
---|---|
Enumeration |
An enumeration of all prefixes declared in this context. |
也可以看看:
String getPrefix (String uri)
返回映射到名称空间URI的前缀之一。
如果多个前缀当前映射到相同的URI,则此方法将进行任意选择; 如果你想要所有的前缀,请使用getPrefixes()
方法。
注意:这永远不会返回空的(默认)前缀; 要检查默认的前缀,请使用参数为“”的getURI
方法。
Parameters | |
---|---|
uri |
String : the namespace URI |
Returns | |
---|---|
String |
one of the prefixes currently mapped to the URI supplied, or null if none is mapped or if the URI is assigned to the default namespace |
Enumeration getPrefixes ()
返回在当前上下文中声明为活动的所有前缀的枚举。 这包括来自未被覆盖的父上下文的声明。
注意:如果有一个默认的前缀,它将不会在这个枚举中返回; 使用参数为“”的getURI
检查默认前缀。
Returns | |
---|---|
Enumeration |
An enumeration of prefixes (never empty). |
Enumeration getPrefixes (String uri)
返回在当前上下文中声明为活动的给定URI的所有前缀的枚举。 这包括来自未被覆盖的父上下文的声明。
此方法返回映射到特定名称空间URI的前缀。 xml:前缀将包含在内。 如果您只需要一个映射到名称空间URI的前缀,并且您不关心获取哪个前缀,则可以使用getPrefix
方法。
注意:这个枚举中不会包含空的(默认)前缀; 要检查是否存在默认名称空间,请使用参数为“”的getURI
方法。
Parameters | |
---|---|
uri |
String : The Namespace URI. |
Returns | |
---|---|
Enumeration |
An enumeration of prefixes (never empty). |
String getURI (String prefix)
查找前缀并获取当前映射的名称空间URI。
此方法在当前上下文中查找前缀。 使用空字符串(“”)作为默认命名空间。
Parameters | |
---|---|
prefix |
String : The prefix to look up. |
Returns | |
---|---|
String |
The associated Namespace URI, or null if the prefix is undeclared in this context. |
也可以看看:
boolean isNamespaceDeclUris ()
如果名称空间声明属性放置在名称空间中,则返回true。 这种行为不是默认的。
Returns | |
---|---|
boolean |
true if namespace declaration attributes are enabled, false otherwise. |
void popContext ()
恢复到以前的命名空间上下文。
通常,您应该在每个XML元素的末尾弹出上下文。 在弹出上下文之后,恢复先前有效的所有名称空间前缀映射。
在弹出一个上下文之后,您不能尝试声明额外的名称空间前缀,除非您先推送另一个上下文。
也可以看看:
String[] processName (String qName, String[] parts, boolean isAttribute)
在当前上下文中的所有声明已由 declarePrefix()
处理后,处理原始的XML限定名称。
此方法通过删除前缀并在当前声明的前缀之间查找,在当前上下文中处理原始XML限定名。 返回值将是由调用者提供的数组,填充如下:
数组中的所有字符串都将被内部化。 如果原始名称的前缀尚未声明,则返回值将为空。
请注意,属性名称的处理方式与元素名称不同:前缀不变的元素名称将接收默认名称空间(如果有),而前缀不固定的属性名称则不会。
Parameters | |
---|---|
qName |
String : The XML qualified name to be processed. |
parts |
String : An array supplied by the caller, capable of holding at least three members. |
isAttribute |
boolean : A flag indicating whether this is an attribute name (true) or an element name (false). |
Returns | |
---|---|
String[] |
The supplied array holding three internalized strings representing the Namespace URI (or empty string), the local name, and the XML qualified name; or null if there is an undeclared prefix. |
void pushContext ()
启动一个新的名称空间上下文。 新的上下文将自动继承其父上下文的声明,但它也将跟踪在此上下文中进行了哪些声明。
事件回调代码应该为每个元素启动一个新的上下文。 这意味着准备在两个地方中的任何一个地方致电。 对于不包含名称空间声明的元素, ContentHandler.startElement()回调是正确的。 对于具有这种声明的元素,它在第一个ContentHandler.startPrefixMapping()回调中完成。 可以使用布尔标志来跟踪上下文是否已经启动。 当这些方法中的任何一个被调用时,它会检查标志以查看是否需要启动新的上下文。 如果是这样,它启动上下文并设置标志。 在ContentHandler.startElement()完成之后,它总是清除标志。
通常,SAX驱动程序会在每个XML元素的开始处推送新的上下文。 然后,他们对属性执行第一遍处理,以处理所有名称空间声明,并创建ContentHandler.startPrefixMapping()回调。 然后进行第二遍,以确定所有属性和元素名称的命名空间限定名称。 最后, ContentHandler.startElement()回调的所有信息都可用,因此可以进行此操作。
名称空间支持对象始终以已经生效的基本上下文开始:在此上下文中,仅声明“xml”前缀。
也可以看看:
void reset ()
重置此名称空间支持对象以供重用。
在重新使用名称空间支持对象进行新会话之前,需要调用此方法。 如果要支持名称空间声明URI,则该标志也必须设置为非默认值。
void setNamespaceDeclUris (boolean value)
控制是否通过processName()
将名称空间声明属性放入NSDECL
名称空间。 这只能在推送任何上下文之前更改。
Parameters | |
---|---|
value |
boolean : the namespace declaration attribute state. A value of true enables this feature, a value of false disables it. |
Throws | |
---|---|
IllegalStateException |
when attempting to set this after any context has been pushed. |