В ниже отрывка 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();
Наилучшим образом насколько мне известно, все стандартные 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
Насколько я могу судить, это будет следующим.
. Я основываю это на этой спецификации . Ниже приводится краткая цитата, которая также может помочь.
Если в области есть объявление пространства имен по умолчанию, расширенное имя , соответствующее имени элемента без префикса, имеет URI пространства имен по умолчанию как его пространство имен имя. Если в области нет объявления пространства имен по умолчанию, имя пространства имен не имеет значения. Имя пространства имен для имени атрибута без префикса всегда не имеет значения. Во всех случаях локальное имя является локальной частью (которое, конечно, совпадает с именем без префикса ).
Пространство имен, объявленное с использованием xmlns = "..."
, становится значением по умолчанию для любых элементов в нем (до тех пор, пока значение по умолчанию не будет повторно объявлено в более глубоком элементе, конечно). В итоге вы получите:
Соответствующий раздел спецификации - это спецификация имен XML, раздел 6.2 :
Объем объявления пространства имен по умолчанию расширяется с самого начала {{1} } начального тега, в котором он появляется до конца соответствующего конечного тега , за исключением области любых объявлений внутреннего пространства имен по умолчанию. В случае пустого тега областью действия является сам тег.
Объявление пространства имен по умолчанию применяется ко всем именам элементов без префикса в его области видимости. Объявления пространств имен по умолчанию не применяются непосредственно к именам атрибутов; интерпретация атрибутов без префикса определяется элементом , в котором они появляются.
Если в области есть объявление пространства имен по умолчанию, расширенное имя , соответствующее имени элемента без префикса, имеет URI пространства имен по умолчанию как его пространство имен имя. Если в области нет объявления пространства имен по умолчанию, имя пространства имен не имеет значения. Имя пространства имен для имени атрибута без префикса всегда не имеет значения. Во всех случаях локальное имя является локальной частью (которое, конечно, совпадает с именем без префикса ).