- java.lang.Object
-
- org.xml.sax.helpers.NamespaceSupport
-
public class NamespaceSupport extends Object
封装使用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 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驱动程序(解析器)可能会选择使用这个类来实现命名空间处理,但是它们不需要这样做。 如果要使用命名空间信息,应用程序本身必须跟踪命名空间信息。
- 从以下版本开始:
- 1.4,SAX 2.0
-
-
构造方法摘要
构造方法 Constructor 描述 NamespaceSupport()
创建一个新的Namespace支持对象。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 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)
控制命名空间声明属性是否被放置在NSDECL
命名空间中,为processName()
。
-
-
-
字段详细信息
-
XMLNS
public static final String XMLNS
XML命名空间URI作为常量。 值为http://www.w3.org/XML/1998/namespace
如“XML中的命名空间”*建议中所定义。这是自动映射到“xml”前缀的命名空间URI。
- 另请参见:
- Constant Field Values
-
NSDECL
public static final String NSDECL
命名空间声明URI为常量。 值为http://www.w3.org/xmlns/2000/
,如“XML中的命名空间”建议的向后不兼容的错误中定义的。 因为这个勘误后SAX2,SAX2默认为原来的建议,通常不会使用这个URI。这是可选地应用于xmlns和xmlns:*属性的命名空间URI,用于声明命名空间。
- 从以下版本开始:
- 1.5,SAX 2.1alpha
- 另请参见:
-
setNamespaceDeclUris(boolean)
,isNamespaceDeclUris()
, Constant Field Values
-
-
方法详细信息
-
reset
public void reset()
重置此Namespace支持对象以供重用。在重新使用新会话的Namespace支持对象之前,需要调用此方法。 如果要支持命名空间声明URI,则该标志也必须设置为非默认值。
-
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()
来解释前缀(可能重新定义)前缀的第二遍。此方法在当前命名空间上下文中声明一个前缀; 前缀将保持有效,直到弹出上下文,除非它在后代上下文中被隐藏。
要声明默认元素Namespace,请使用空字符串作为前缀。
请注意,此库中存在不对称:即使您声明了默认元素命名空间,
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)
处理原始XML限定名称,在当前上下文中的所有声明都已由declarePrefix()
处理之后 。此方法通过删除前缀并在当前声明的前缀中查找原始XML限定名称来处理当前上下文中的原始XML限定名称。 返回值将是调用者提供的数组,填入如下:
- 份[0]
- 命名空间URI,或空字符串,如果没有使用。
- 份[1]
- 本地名称(无前缀)。
- 份[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()
- 结果
- 枚举前缀(从不为空)。
- 另请参见:
-
getDeclaredPrefixes()
,getURI(java.lang.String)
-
getPrefix
public String getPrefix(String uri)
返回映射到命名空间URI的前缀之一。如果多个前缀当前映射到同一个URI,则该方法将进行任意选择; 如果您想要所有的前缀,请改用
getPrefixes()
方法。注意:这将永远不会返回空(默认)前缀; 要检查默认前缀,请使用参数“”“的
getURI
方法。- 参数
-
uri
- 命名空间URI - 结果
- 当前映射到提供的URI的前缀之一,如果没有映射,则为空,或者将URI分配给默认命名空间
- 另请参见:
-
getPrefixes(java.lang.String)
,getURI(java.lang.String)
-
getPrefixes
public Enumeration getPrefixes(String 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)
控制命名空间声明属性是否被放置在NSDECL
命名空间中processName()
。 200新X-45旗新新200新新新200新200新新200新200新新200新新200新200新新200新新200新200新新200新新200新新200新新200新新200新新200新新200新新200新- 异常
-
IllegalStateException
- 尝试在任何上下文被推送后进行设置。 - 从以下版本开始:
- 1.5,SAX 2.1alpha
-
isNamespaceDeclUris
public boolean isNamespaceDeclUris()
如果将命名空间声明属性放入命名空间,则返回true。 此行为不是默认值。- 从以下版本开始:
- 1.5,SAX 2.1alpha
-
-