Most visited

Recently visited

Added in API level 1

NamespaceSupport

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驱动程序(解析器)可能选择使用此类来实现名称空间处理,但它们不需要这样做。 如果应用程序想要使用名称空间信息,它们必须自己跟踪名称空间信息。

Summary

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)

在当前上下文中的所有声明已由 declarePrefix()处理后处理原始的XML限定名称。

void pushContext()

启动一个新的名称空间上下文。

void reset()

重置此名称空间支持对象以供重用。

void setNamespaceDeclUris(boolean value)

控制是否通过 processName()将名称空间声明属性放置到 NSDECL名称空间中。

Inherited methods

From class java.lang.Object

Constants

NSDECL

Added in API level 1
String NSDECL

名称空间声明URI作为常量。 值为http://www.w3.org/xmlns/2000/ ,如在“XML中的名称空间”建议中向后不兼容的勘误中所定义的。 由于该纠错后期SAX2,SAX2默认为原始建议,并且通常不使用此URI。

这是可选应用于 xmlnsxmlns:*属性的名称空间URI,用于声明名称空间。

也可以看看:

常量值:“http://www.w3.org/xmlns/2000/”

XMLNS

Added in API level 1
String XMLNS

XML名称空间URI作为常量。 值为http://www.w3.org/XML/1998/namespace如“XML中的命名空间”*的建议中所定义的。

这是自动映射到“xml”前缀的名称空间URI。

常量值:“http://www.w3.org/XML/1998/namespace”

Public constructors

NamespaceSupport

Added in API level 1
NamespaceSupport ()

创建一个新的名称空间支持对象。

Public methods

declarePrefix

Added in API level 1
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

也可以看看:

getDeclaredPrefixes

Added in API level 1
Enumeration getDeclaredPrefixes ()

返回在此上下文中声明的所有前缀的枚举。

这个枚举中将包含空的(默认)前缀; 请注意,此行为不同于getPrefix(String)getPrefixes()

Returns
Enumeration An enumeration of all prefixes declared in this context.

也可以看看:

getPrefix

Added in API level 1
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

也可以看看:

getPrefixes

Added in API level 1
Enumeration getPrefixes ()

返回在当前上下文中声明为活动的所有前缀的枚举。 这包括来自未被覆盖的父上下文的声明。

注意:如果有一个默认的前缀,它将不会在这个枚举中返回; 使用参数为“”的getURI检查默认前缀。

Returns
Enumeration An enumeration of prefixes (never empty).

也可以看看:

getPrefixes

Added in API level 1
Enumeration getPrefixes (String uri)

返回在当前上下文中声明为活动的给定URI的所有前缀的枚举。 这包括来自未被覆盖的父上下文的声明。

此方法返回映射到特定名称空间URI的前缀。 xml:前缀将包含在内。 如果您只需要一个映射到名称空间URI的前缀,并且您不关心获取哪个前缀,则可以使用getPrefix方法。

注意:这个枚举中不会包含空的(默认)前缀; 要检查是否存在默认名称空间,请使用参数为“”的getURI方法。

Parameters
uri String: The Namespace URI.
Returns
Enumeration An enumeration of prefixes (never empty).

也可以看看:

getURI

Added in API level 1
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.

也可以看看:

isNamespaceDeclUris

Added in API level 1
boolean isNamespaceDeclUris ()

如果名称空间声明属性放置在名称空间中,则返回true。 这种行为不是默认的。

Returns
boolean true if namespace declaration attributes are enabled, false otherwise.

popContext

Added in API level 1
void popContext ()

恢复到以前的命名空间上下文。

通常,您应该在每个XML元素的末尾弹出上下文。 在弹出上下文之后,恢复先前有效的所有名称空间前缀映射。

在弹出一个上下文之后,您不能尝试声明额外的名称空间前缀,除非您先推送另一个上下文。

也可以看看:

processName

Added in API level 1
String[] processName (String qName, 
                String[] parts, 
                boolean isAttribute)

在当前上下文中的所有声明已由 declarePrefix()处理后,处理原始的XML限定名称。

此方法通过删除前缀并在当前声明的前缀之间查找,在当前上下文中处理原始XML限定名。 返回值将是由调用者提供的数组,填充如下:

parts[0]
The Namespace URI, or an empty string if none is in use.
parts[1]
The local name (without prefix).
parts[2]
The original raw name.

数组中的所有字符串都将被内部化。 如果原始名称的前缀尚未声明,则返回值将为空。

请注意,属性名称的处理方式与元素名称不同:前缀不变的元素名称将接收默认名称空间(如果有),而前缀不固定的属性名称则不会。

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.

也可以看看:

pushContext

Added in API level 1
void pushContext ()

启动一个新的名称空间上下文。 新的上下文将自动继承其父上下文的声明,但它也将跟踪在此上下文中进行了哪些声明。

事件回调代码应该为每个元素启动一个新的上下文。 这意味着准备在两个地方中的任何一个地方致电。 对于不包含名称空间声明的元素, ContentHandler.startElement()回调是正确的。 对于具有这种声明的元素,它在第一个ContentHandler.startPrefixMapping()回调中完成。 可以使用布尔标志来跟踪上下文是否已经启动。 当这些方法中的任何一个被调用时,它会检查标志以查看是否需要启动新的上下文。 如果是这样,它启动上下文并设置标志。 ContentHandler.startElement()完成之后,它总是清除标志。

通常,SAX驱动程序会在每个XML元素的开始处推送新的上下文。 然后,他们对属性执行第一遍处理,以处理所有名称空间声明,并创建ContentHandler.startPrefixMapping()回调。 然后进行第二遍,以确定所有属性和元素名称的命名空间限定名称。 最后, ContentHandler.startElement()回调的所有信息都可用,因此可以进行此操作。

名称空间支持对象始终以已经生效的基本上下文开始:在此上下文中,仅声明“xml”前缀。

也可以看看:

reset

Added in API level 1
void reset ()

重置此名称空间支持对象以供重用。

在重新使用名称空间支持对象进行新会话之前,需要调用此方法。 如果要支持名称空间声明URI,则该标志也必须设置为非默认值。

也可以看看:

setNamespaceDeclUris

Added in API level 1
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.

Hooray!