在下面的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();
答案 0 :(得分:12)
据我所知,它将如下所示。
我的基础是specification。以下是帮助的摘要引用。
如果有默认命名空间 声明范围,扩大 对应于未加前缀的名称 元素名称具有的URI default namespace作为其命名空间 名称。如果没有默认名称空间 范围内的声明,命名空间 名字没有价值。命名空间名称 对于未加前缀的属性名称 永远没有价值。在所有情况下, 本地名称是本地部分(属于 当然和没有前缀的名字一样 本身)。
答案 1 :(得分:8)
使用xmlns="..."
声明的名称空间成为其中任何元素的默认名称(直到默认值然后在更深层元素中重新声明)。所以你最终得到:
相关规范部分是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