Установка по умолчанию/наследование пространства имен 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 уважают официальную установку по умолчанию пространства имен? У меня есть tride org.w2c.* пакеты DOM, однако это, кажется, не разрешает пространство имен URI правильно? Например, что-то со схожей функциональностью к.

String namespace = DocumentParser.parse().
                    getElement("a").
                    getElement("b").
                    getElement("c").
                    getNamespaceURI();
6
задан ng. 3 February 2010 в 15:54
поделиться

3 ответа

Наилучшим образом насколько мне известно, все стандартные XML API в Java поддерживают пространства имен. Многие API были написаны до того, как были созданы пространства имен (или стали популярными - я уже не помню). Часто требуется включить поддержку :

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
5
ответ дан 8 December 2019 в 04:29
поделиться

Насколько я могу судить, это будет следующим.

  • a будет http: // domain / a , поскольку это пространство имен по умолчанию
  • b будет http: // domain / b , поскольку это определенное пространство имен для b
  • c будет http: // domain / a , поскольку это пространство имен по умолчанию
  • d будет пустым / неустановленным пространством имен из-за переустановки пространства имен
  • e будет пустым / неустановленным пространством имен, поскольку оно вложено в новое объявление

. Я основываю это на этой спецификации . Ниже приводится краткая цитата, которая также может помочь.

Если в области есть объявление пространства имен по умолчанию, расширенное имя , соответствующее имени элемента без префикса, имеет URI пространства имен по умолчанию как его пространство имен имя. Если в области нет объявления пространства имен по умолчанию, имя пространства имен не имеет значения. Имя пространства имен для имени атрибута без префикса всегда не имеет значения. Во всех случаях локальное имя является локальной частью (которое, конечно, совпадает с именем без префикса ).

12
ответ дан 8 December 2019 в 04:29
поделиться

Пространство имен, объявленное с использованием xmlns = "..." , становится значением по умолчанию для любых элементов в нем (до тех пор, пока значение по умолчанию не будет повторно объявлено в более глубоком элементе, конечно). В итоге вы получите:

  • a использует http: // domain / a (задано по умолчанию)
  • b использует http: // domain / b (указано , но не по умолчанию)
  • c использует http: // domain / a (унаследовано от a)
  • d не имеет пространства имен (задано как новое значение по умолчанию)
  • e не имеет пространства имен (унаследовано от d)

Соответствующий раздел спецификации - это спецификация имен XML, раздел 6.2 :

Объем объявления пространства имен по умолчанию расширяется с самого начала {{1} } начального тега, в котором он появляется до конца соответствующего конечного тега , за исключением области любых объявлений внутреннего пространства имен по умолчанию. В случае пустого тега областью действия является сам тег.

Объявление пространства имен по умолчанию применяется ко всем именам элементов без префикса в его области видимости. Объявления пространств имен по умолчанию не применяются непосредственно к именам атрибутов; интерпретация атрибутов без префикса определяется элементом , в котором они появляются.

Если в области есть объявление пространства имен по умолчанию, расширенное имя , соответствующее имени элемента без префикса, имеет URI пространства имен по умолчанию как его пространство имен имя. Если в области нет объявления пространства имен по умолчанию, имя пространства имен не имеет значения. Имя пространства имен для имени атрибута без префикса всегда не имеет значения. Во всех случаях локальное имя является локальной частью (которое, конечно, совпадает с именем без префикса ).

8
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: