模块  java.xml
软件包  org.xml.sax.helpers

Class 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
    • 字段详细信息

      • XMLNS

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

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

        另请参见:
        常数字段值
      • NSDECL

        public static final String NSDECL
        名称空间声明URI作为常量。 值为http://www.w3.org/xmlns/2000/ ,与“XML中的命名空间”建议的向后兼容的错误中定义。 由于该勘误表是SAX2的后期,因此SAX2默认为原始建议,并且通常不使用此URI。

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

        从以下版本开始:
        1.5,SAX 2.1alpha
        另请参见:
        setNamespaceDeclUris(boolean)isNamespaceDeclUris()常数字段值
    • 构造方法详细信息

      • NamespaceSupport

        public NamespaceSupport()
        创建一个新的命名空间支持对象。
    • 方法详细信息

      • reset

        public void reset()
        重置此命名空间支持对象以供重用。

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

        另请参见:
        setNamespaceDeclUris(boolean)
      • pushContext

        public void pushContext()
        启动一个新的命名空间上下文。 新上下文将自动继承其父上下文的声明,但它还将跟踪在此上下文中进行的声明。

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

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

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

        另请参见:
        ContentHandlerpopContext()
      • popContext

        public void popContext()
        恢复到以前的命名空间上下文。

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

        除非先推送另一个上下文,否则在弹出上下文后,不得尝试声明其他命名空间前缀。

        另请参见:
        pushContext()
      • declarePrefix

        public boolean declarePrefix​(String prefix,
                                     String uri)
        声明名称空间前缀。 所有前缀必须在引用之前声明。 例如,SAX驱动程序(解析器)将在两个过程中扫描元素的属性:首先是名称空间声明,然后是第二次使用processName()来解释(可能重新定义的)前缀的前缀。

        此方法在当前Namespace上下文中声明前缀; 在弹出此上下文之前,前缀将保持有效,除非它在后代上下文中被遮蔽。

        要声明默认元素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)
        在当前上下文中的所有声明都由declarePrefix()处理之后,处理原始XML限定名称。

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

        份[0]
        名称空间URI,如果没有使用,则为空字符串。
        份[1]
        本地名称(不带前缀)。
        份[2]
        原始原始名称。

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

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

        参数
        qName - 要处理的XML限定名称。
        parts - 呼叫者提供的阵列,能够容纳至少三个成员。
        isAttribute - 指示这是属性名称(true)还是元素名称(false)的标志。
        结果
        提供的数组包含三个内部化字符串,表示Namespace 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<String> getPrefixes()
        返回其声明在当前上下文中处于活动状态的所有前缀的枚举。 这包括来自未被覆盖的父上下文的声明。

        注意:如果有默认前缀,则不会在此枚举中返回; 使用带参数“”的getURI检查默认前缀。

        结果
        枚举前缀(从不为空)。
        另请参见:
        getDeclaredPrefixes()getURI(java.lang.String)
      • getPrefix

        public String getPrefix​(String uri)
        返回映射到名称空间URI的前缀之一。

        如果当前多个前缀映射到同一个URI,则此方法将进行任意选择; 如果您想要所有前缀,请改用getPrefixes()方法。

        注意:这永远不会返回空(默认)前缀; 要检查默认前缀,请使用参数为“”的getURI方法。

        参数
        uri - 名称空间URI
        结果
        当前映射到提供的URI的前缀之一,如果没有映射,或者URI被分配给默认命名空间,则为null
        另请参见:
        getPrefixes(java.lang.String)getURI(java.lang.String)
      • getPrefixes

        public Enumeration<String> getPrefixes​(String uri)
        返回给定URI的所有前缀的枚举,其声明在当前上下文中处于活动状态。 这包括来自未被覆盖的父上下文的声明。

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

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

        参数
        uri - 命名空间URI。
        结果
        枚举前缀(从不为空)。
        另请参见:
        getPrefix(java.lang.String)getDeclaredPrefixes()getURI(java.lang.String)
      • setNamespaceDeclUris

        public void setNamespaceDeclUris​(boolean value)
        控制是否通过processName()将名称空间声明属性放入NSDECL名称空间。 这可能只有在推送任何上下文之前才能更改。
        异常
        IllegalStateException - 尝试在推送任何上下文后设置此项。
        从以下版本开始:
        1.5,SAX 2.1alpha
      • isNamespaceDeclUris

        public boolean isNamespaceDeclUris()
        如果将名称空间声明属性放入名称空间,则返回true。 此行为不是默认行为。
        从以下版本开始:
        1.5,SAX 2.1alpha