public class NamespaceSupport extends Object
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 qnames。
命名空间支持对象是可重用的,但必须在每个会话之间调用reset方法。
这是一个简单的会话:
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();
请注意,此类针对大多数元素不包含Namespace声明的用例进行了优化:如果为每个上下文重复相同的前缀/ URI映射(例如),则此类的效率会稍差一些。
虽然SAX驱动程序(解析器)可能会选择使用这个类来实现命名空间处理,但是它们不需要这样做。 如果要使用命名空间信息,应用程序本身必须跟踪命名空间信息。
Modifier and Type | Field and Description |
---|---|
static String |
NSDECL
命名空间声明URI为常量。
|
static String |
XMLNS
XML命名空间URI作为常量。
|
Constructor and Description |
---|
NamespaceSupport()
创建一个新的Namespace支持对象。
|
Modifier and Type | Method and Description |
---|---|
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)
处理原始XML限定名,之后在目前情况下的所有声明已被处理
declarePrefix() 。
|
void |
pushContext()
启动一个新的命名空间上下文。
|
void |
reset()
重置此Namespace支持对象以供重用。
|
void |
setNamespaceDeclUris(boolean value)
|
public static final String XMLNS
http://www.w3.org/XML/1998/namespace
,如“XML中的命名空间”*中所定义。
这是自动映射到“xml”前缀的命名空间URI。
public static final String NSDECL
http://www.w3.org/xmlns/2000/
,如“XML中的命名空间”推荐与向后不兼容的错误定义的。
因为这个勘误后SAX2,SAX2默认为原来的建议,通常不会使用这个URI。
这是可选地应用于xmlns和xmlns:*属性的命名空间URI,用于声明命名空间。
setNamespaceDeclUris(boolean)
,
isNamespaceDeclUris()
,
Constant Field Values
public void reset()
在重新使用新会话的Namespace支持对象之前,需要调用此方法。 如果要支持命名空间声明URI,则该标志也必须设置为非默认值。
public void pushContext()
事件回调代码应该为每个元素启动一个新的上下文。 这意味着准备在两个地方之间调用。 对于不包含命名空间声明的元素, ContentHandler.startElement()回调是正确的位置。 对于具有这种声明的元素,它在第一个ContentHandler.startPrefixMapping()回调中完成。 可以使用布尔标志来跟踪上下文是否已经开始。 当调用这些方法之一时,它会检查该标志以查看是否需要启动新的上下文。 如果是这样,它启动上下文并设置该标志。 在ContentHandler.startElement()这样做之后,它总是清除该标志。
通常,SAX驱动程序将在每个XML元素的开头推送一个新的上下文。 然后,他们首先执行属性来处理所有命名空间声明,从而使ContentHandler.startPrefixMapping()回调。 然后进行第二次传递,以确定所有属性和元素名称的命名空间限定名称。 最后, ContentHandler.startElement()回调的所有信息都可用,因此可以被创建。
命名空间支持对象始终以已经有效的基本上下文开头:在这种情况下,只会声明“xml”前缀。
ContentHandler
, popContext()
public void popContext()
通常,您应该弹出每个XML元素末尾的上下文。 弹出上下文后,所有先前有效的命名空间前缀映射都将被还原。
弹出上下文后,您不得尝试声明额外的命名空间前缀,除非您首先推送另一个上下文。
pushContext()
public boolean declarePrefix(String prefix, String uri)
processName()
解释前缀(可能重新定义)前缀的第二遍。
此方法在当前命名空间上下文中声明一个前缀; 前缀将保持有效,直到弹出上下文,除非它在后代上下文中被隐藏。
要声明默认元素Namespace,请使用空字符串作为前缀。
请注意,此库中存在不对称: getPrefix
不会返回“”前缀,即使已声明默认元素命名空间。 要检查默认命名空间,您必须使用getURI
显式查找 。 存在这种不对称性,以便更容易地查找属性名称的前缀,其中不允许使用默认前缀。
prefix
- 要声明的前缀,或用于指示默认元素命名空间的空字符串。
这可能永远不会有值“xml”或“xmlns”。
uri
- 与前缀关联的命名空间URI。
processName(java.lang.String, java.lang.String[], boolean)
,
getURI(java.lang.String)
,
getPrefix(java.lang.String)
public String[] processName(String qName, String[] parts, boolean isAttribute)
declarePrefix()
。
此方法通过删除前缀并在当前声明的前缀中查找原始XML限定名称来处理当前上下文中的原始XML限定名称。 返回值将是调用者提供的数组,填入如下:
数组中的所有字符串将被内化。 如果原始名称的前缀未被声明,那么返回值将为null。
请注意,属性名称的处理方式与元素名称不同:未校正的元素名称将接收默认名称空间(如果有),而未定义的属性名称将不会。
qName
- 要处理的XML限定名称。
parts
- 由调用者提供的一个数组,能够容纳至少三个成员。
isAttribute
- 表示这是属性名称(true)还是元素名称(false)的标志。
declarePrefix(java.lang.String, java.lang.String)
,
String.intern()
public String getURI(String prefix)
此方法查找当前上下文中的前缀。 使用空字符串(“”)作为默认命名空间。
prefix
- 要查找的前缀。
getPrefix(java.lang.String)
,
getPrefixes()
public Enumeration getPrefixes()
getDeclaredPrefixes()
,
getURI(java.lang.String)
public String getPrefix(String uri)
如果多个前缀当前映射到同一个URI,则该方法将进行任意选择; 如果您想要所有的前缀,请改用getPrefixes()
方法。
注意:这将永远不会返回空(默认)前缀; 要检查默认前缀,请使用参数为“”的getURI
方法。
uri
- 命名空间URI
getPrefixes(java.lang.String)
,
getURI(java.lang.String)
public Enumeration getPrefixes(String uri)
此方法返回映射到特定命名空间URI的前缀。 将包括xml:前缀。 如果您只想要一个映射到命名空间URI的前缀,并且您不在乎哪个前缀,请改用getPrefix
方法。
注意:空(默认)前缀从不包含在此枚举中; 检查是否存在默认名称空间,请使用参数“”“的getURI
方法。
uri
- 命名空间URI。
getPrefix(java.lang.String)
,
getDeclaredPrefixes()
,
getURI(java.lang.String)
public Enumeration getDeclaredPrefixes()
空(默认)前缀将包含在此枚举中; 请注意,此行为与getPrefix(java.lang.String)
和getPrefixes()
不同 。
getPrefixes()
,
getURI(java.lang.String)
public void setNamespaceDeclUris(boolean value)
IllegalStateException
- 尝试在任何上下文被推送后设置此选项。
public boolean isNamespaceDeclUris()