Module java.xml

Class NamespaceSupport

java.lang.Object
org.xml.sax.helpers.NamespaceSupport

public class NamespaceSupport extends Object
封装命名空间逻辑,供使用SAX的应用程序使用,或者由SAX驱动程序内部使用。

此类封装了命名空间处理的逻辑:它跟踪当前每个上下文中生效的声明,并自动将合格的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("命名空间URI: " + parts[0]);
 System.out.println("本地名称: " + parts[1]);
 System.out.println("原始名称: " + parts[2]);

 parts = support.processName("dc:title", parts, false);
 System.out.println("命名空间URI: " + parts[0]);
 System.out.println("本地名称: " + parts[1]);
 System.out.println("原始名称: " + parts[2]);

 support.popContext();
 

请注意,此类针对大多数元素不包含命名空间声明的用例进行了优化:如果相同的前缀/URI映射在每个上下文中重复(例如),此类将稍微不那么高效。

虽然SAX驱动程序(解析器)可以选择使用此类来实现命名空间处理,但不要求这样做。如果应用程序想要使用命名空间信息,必须自行跟踪命名空间信息。

自 JDK 版本:
1.4, SAX 2.0
  • Field Details

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

      自 JDK 版本:
      1.5, SAX 2.1alpha
      参见:
  • Constructor Details

    • NamespaceSupport

      public NamespaceSupport()
      创建一个新的命名空间支持对象。
  • Method Details

    • reset

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

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

      参见:
    • pushContext

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

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

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

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

      参见:
    • popContext

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

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

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

      参见:
    • declarePrefix

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

      此方法在当前命名空间上下文中声明前缀;该前缀将保持生效,直到此上下文被弹出,除非在后代上下文中被遮蔽。

      要声明默认元素命名空间,请使用空字符串作为前缀。

      请注意,此库中存在一个不对称性:getPrefix不会返回“”前缀,即使您已声明了默认元素命名空间。要检查默认命名空间,必须使用getURI显式查找它。这种不对称性存在是为了更容易查找属性名称的前缀,其中不允许使用默认前缀。

      参数:
      prefix - 要声明的前缀,或空字符串表示默认元素命名空间。此值不能为“xml”或“xmlns”。
      uri - 要与前缀关联的命名空间URI。
      返回:
      如果前缀合法,则返回true,否则返回false
      参见:
    • 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。
      参见:
    • getURI

      public String getURI(String prefix)
      查找前缀并获取当前映射的命名空间URI。

      此方法在当前上下文中查找前缀。对于默认命名空间,请使用空字符串("")。

      参数:
      prefix - 要查找的前缀。
      返回:
      关联的命名空间URI,如果前缀在此上下文中未声明,则返回null。
      参见:
    • getPrefixes

      public Enumeration<String> getPrefixes()
      返回当前上下文中活动的所有前缀的枚举。这包括尚未被覆盖的父上下文中的声明。

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

      返回:
      前缀的枚举(永不为空)。
      参见:
    • getPrefix

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

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

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

      参数:
      uri - 命名空间URI
      返回:
      当前映射到提供的URI的前缀之一,如果没有映射或者URI分配给默认命名空间,则返回null
      参见:
    • getPrefixes

      public Enumeration<String> getPrefixes(String uri)
      返回当前上下文中活动的所有映射到给定URI的前缀的枚举。这包括尚未被覆盖的父上下文中的声明。

      此方法返回映射到特定命名空间URI的前缀。xml:前缀将被包括在内。如果您只想要映射到命名空间URI的一个前缀,并且不在乎得到哪一个,请改用getPrefix方法。

      注意: 空(默认)前缀永远不会包含在此枚举中;要检查默认命名空间的存在,请使用带有""参数的getURI方法。

      参数:
      uri - 命名空间URI。
      返回:
      前缀的枚举(永不为空)。
      参见:
    • getDeclaredPrefixes

      public Enumeration<String> getDeclaredPrefixes()
      返回此上下文中声明的所有前缀的枚举。

      空(默认)前缀将包括在此枚举中;请注意,这与getPrefix(java.lang.String)getPrefixes()的行为不同。

      返回:
      此上下文中声明的所有前缀的枚举。
      参见:
    • setNamespaceDeclUris

      public void setNamespaceDeclUris(boolean value)
      控制是否将命名空间声明属性放入NSDECL命名空间中,由processName()执行。这只能在推送任何上下文之前更改。
      参数:
      value - 指示是否将命名空间声明属性放入NSDECL命名空间的标志
      抛出:
      IllegalStateException - 在推送任何上下文之后尝试设置此值时
      自:
      1.5, SAX 2.1alpha
    • isNamespaceDeclUris

      public boolean isNamespaceDeclUris()
      如果命名空间声明属性放入命名空间中,则返回true。这不是默认行为。
      返回:
      如果命名空间声明属性放入命名空间中,则返回true,否则返回false
      自:
      1.5, SAX 2.1alpha