如何判断XML元素是否自身声明xmlns及定位首个指定命名空间元素
关于XML命名空间继承与声明判断的问题解答
XML命名空间是否继承?
没错,XML的默认命名空间(不带前缀的xmlns声明)是会被子元素继承的。当你在<xxx1>上声明xmlns="hello"后,所有没有自己显式声明命名空间的子元素(比如<xxx2>、<xxx3>)都会自动继承这个默认命名空间,所以它们的getNamespaceURI()方法返回"hello"是完全符合规范的——这代表它们当前生效的命名空间是"hello",但这个命名空间是继承来的,不是自身声明的。
如何判断元素是否自身声明了xmlns属性?
要区分“继承的命名空间”和“自身声明的命名空间”,不能只依赖getNamespaceURI()方法(它返回的是元素当前使用的命名空间,包含继承的)。你需要直接检查元素的属性集合,看它是否自身携带了xmlns属性:
- 在DOM API中,可以通过元素的
attributes集合查找是否存在名为xmlns的属性,或者调用element.getNamedItem("xmlns"),如果返回的属性节点非空,且属性值等于"hello",就说明这个元素是自身声明了该默认命名空间的。 - 简单来说:
getNamespaceURI()告诉你元素用的是什么命名空间,而检查元素自身的xmlns属性,才能知道这个命名空间是不是它自己声明的。
哪个元素是真正声明xmlns="hello"的?
在你提供的XML里,只有<xxx1>是真正显式声明了xmlns="hello"的元素。<xxx2>和<xxx3>没有自己写xmlns属性,它们的命名空间完全是从父元素继承来的,所以它们并不是命名空间的声明者。
针对你的场景的解决方案
如果你想找到首个(最顶层的)声明xmlns="hello"的元素,不要用getParent().getNamespaceURI() == "hello"来判断,而是应该从目标节点(比如<name>)往上遍历祖先元素,对每个元素检查:
- 它自身是否存在
xmlns="hello"的属性声明 - 找到第一个满足条件的元素,就是你要的
<xxx1>
内容的提问来源于stack exchange,提问作者alluLinger
相关产品推荐
相关产品推荐

