XML命名空间默认/继承

时间:2010-02-03 15:54:06

标签: java xml

在下面的XML片段中,a,c,d和e的命名空间是什么?欢迎参考文档或规范。

<a xmlns="http://domain/a">
    <pre:b xmlns:pre="http://domain/b">
        <c/>
        <d xmlns="">
            <e/>
        </d>
    </pre:b>
</a>

此外,哪些Java框架尊重官方命名空间默认?我已经删除了org.w2c。* DOM包,但它似乎没有正确解析名称空间URI?例如,具有与。

类似功能的东西
String namespace = DocumentParser.parse().
                    getElement("a").
                    getElement("b").
                    getElement("c").
                    getNamespaceURI();

3 个答案:

答案 0 :(得分:12)

据我所知,它将如下所示。

  • a将是http://domain/a,因为这是默认命名空间
  • b将为http://domain/b,因为这是b
  • 的已定义命名空间
  • c将为http://domain/a,因为这是默认命名空间
  • 由于重新设置了命名空间,
  • d将是一个空白/未设置的命名空间
  • e将是一个空白/未设置的命名空间,因为它嵌套在新的声明

我的基础是specification。以下是帮助的摘要引用。

  

如果有默认命名空间   声明范围,扩大   对应于未加前缀的名称   元素名称具有的URI   default namespace作为其命名空间   名称。如果没有默认名称空间   范围内的声明,命名空间   名字没有价值。命名空间名称   对于未加前缀的属性名称   永远没有价值。在所有情况下,   本地名称是本地部分(属于   当然和没有前缀的名字一样   本身)。

答案 1 :(得分:8)

使用xmlns="..."声明的名称空间成为其中任何元素的默认名称(直到默认值然后在更深层元素中重新声明)。所以你最终得到:

  • a使用http://domain/a(指定为默认值)
  • b使用http://domain/b(指定,但不是默认值)
  • c使用http://domain/a(继承自a)
  • d没有命名空间(指定为新的默认值)
  • e没有名称空间(继承自d)

相关规范部分是XML名称规范,section 6.2

  

默认命名空间的范围   声明从一开始就延伸   它出现的起始标签   到相应的结尾   结束标记,不包括任何范围   内部默认命名空间声明。   在空标记的情况下,范围   是标签本身。

     

默认命名空间声明   适用于所有未加前缀的元素   其范围内的名称。默认   名称空间声明不适用   直接属性名称;该   解释无前缀   属性由。确定   它们出现的元素。

     

如果有默认命名空间   声明范围,扩大   对应于未加前缀的名称   元素名称具有的URI   default namespace作为其命名空间   名称。如果没有默认名称空间   范围内的声明,命名空间   名字没有价值。命名空间名称   对于未加前缀的属性名称   永远没有价值。在所有情况下,   本地名称是本地部分(属于   当然和没有前缀的名字一样   本身)。

答案 2 :(得分:5)

据我所知,Java中的所有标准XML API都支持名称空间。许多API是在命名空间创建之前编写的(或者变得流行 - 我再也记不住了)。您经常需要enable support

public class NS {
  private static void print(Node node) {
    Queue<Node> nodes = new LinkedList<Node>();
    nodes.add(node);
    while (!nodes.isEmpty()) {
      node = nodes.poll();
      NodeList list = node.getChildNodes();
      for (int i = 0; i < list.getLength(); i++) {
        nodes.add(list.item(i));
      }
      System.out.format("%s %s %s%n", node.getPrefix(), node.getLocalName(),
          node.getNamespaceURI());
    }
  }

  public static void main(String[] args) throws Exception {
    String xml = "<a xmlns=\"http://domain/a\">"
        + "<pre:b xmlns:pre=\"http://domain/b\">" + "<c/>" + "<d xmlns=\"\">"
        + "<e/>" + "</d>" + "</pre:b>" + "</a>";

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    Document doc = dbf.newDocumentBuilder().parse(
        new InputSource(new StringReader(xml)));
    print(doc.getDocumentElement());
  }
}

此代码将打印:

null a http://domain/a
pre b http://domain/b
null c http://domain/a
null d null
null e null