所有类
|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
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。
名称空间支持对象是可重用的,但是在每个会话之间必须调用 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();
注意,对于多数元素不包含名称空间声明的使用情况,必须优化此类:例如,如果对每个上下文都重复相同的前缀/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。这是可以选择应用到 xmlns 和 xmlns:* 属性的名称空间 URI,使用它声明名称空间。
- 从以下版本开始:
- SAX 2.1alpha
- 另请参见:
setNamespaceDeclUris(boolean)
,isNamespaceDeclUris()
, 常量字段值
构造方法详细信息 |
---|
NamespaceSupport
public NamespaceSupport()
- 创建新的名称空间支持对象。
方法详细信息 |
---|
reset
public void reset()
-
重设此名称空间支持对象,以便重新使用。
在为新的会话重用名称空间支持对象之前,有必要调用此方法。如果要支持名称空间声明 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()
根据(潜在预定义的)前缀解释前缀。此方法在当前名称空间上下文中声明前缀;在弹出此上下文之前,前缀仍保持有效,除非它在后代上下文中映像。
要声明默认元素名称空间,请使用空字符串作为前缀。
注意,在此库中存在不对称:即使声明了默认元素名称空间,
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()