代码之家  ›  专栏  ›  技术社区  ›  ng.

XML命名空间默认/继承

  •  6
  • ng.  · 技术社区  · 16 年前

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

    还有,哪些Java框架尊重官方的名称空间默认设置?我有tride org.w2c.*DOM包,但是它似乎没有正确解析名称空间URI?例如,具有类似功能的东西。

    String namespace = DocumentParser.parse().
                        getElement("a").
                        getElement("b").
                        getElement("c").
                        getNamespaceURI();
    
    3 回复  |  直到 16 年前
        1
  •  5
  •   McDowell rahul gupta    16 年前

    据我所知,Java中的所有标准XMLAPI都支持名称空间。许多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
    
        2
  •  12
  •   Mitchel Sellers    16 年前

    据我所知,情况如下。

    我是基于这个 specification . 下面是一个简要的报价,以帮助以及。

    声明在范围内,扩展了 与未固定名称相对应的名称 默认名称空间作为其名称空间 名称如果没有默认名称空间 范围中的声明,命名空间 名称没有值。名称空间名称 对于不固定的属性名称 总是没有价值。在所有情况下 课程名称与非固定名称相同 本身)。

        3
  •  8
  •   Jon Skeet    16 年前

    xmlns="..." 成为其中任何元素的默认值(当然,直到在更深的元素中重新声明默认值)。因此,你最终会:

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

    默认命名空间的作用域 它出现在其中的开始标记的名称 到相应的 结束标记,不包括任何 内部默认名称空间声明。 对于空标记,范围 是标签本身。

    适用于所有未固定的元素 其范围内的名称。违约 直接指向属性名称;这个 属性由 显示它们的元素。

    如果存在默认名称空间 声明在范围内,扩展了 元素名具有 默认名称空间作为其名称空间 名称如果没有默认名称空间 名称没有值。名称空间名称 对于不固定的属性名称 课程名称与非固定名称相同 本身)。