Module  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。

        另请参见:
        Constant Field Values
      • 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()Constant Field Values
    • 构造方法详细信息

      • NamespaceSupport

        public NamespaceSupport​()
        创建一个新的Namespace支持对象。
    • 方法详细信息

      • reset

        public void reset​()
        重置此Namespace支持对象以供重用。

        在重新使用新会话的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,请使用空字符串作为前缀。

        请注意,此库中存在不对称:即使您声明了默认元素命名空间, 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​()
        返回其声明在当前上下文中处于活动状态的所有前缀的枚举。 这包括父上下文中尚未被覆盖的声明。

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

        结果
        枚举前缀(从不为空)。
        另请参见:
        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)
      • 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