Document该类的Javadoc 在下有以下注释getElementById。
Document
getElementById
注意:除非如此定义,否则名称为“ ID”或“ id”的属性不是ID类型的
因此,我将XHTML文档读入DOM(使用Xerces 2.9.1)。
该文档中有一个普通的旧文档<p id='fribble'>。
<p id='fribble'>
我叫getElementById("fribble"),它返回null。
getElementById("fribble")
我使用XPath来获取“ // * [id =’fribble’]”,一切都很好。
因此,问题是,是什么导致DocumentBuilder实际将ID属性标记为“如此定义”?
DocumentBuilder
为了进行getElementById()调用,Document必须知道其节点的类型,并且目标节点必须是XML ID类型,方法才能找到它。它通过关联的架构了解其元素的类型。如果未设置架构,或者未将id属性声明为XML ID类型,getElementById()则将永远找不到它。
getElementById()
id
我的猜测是您的文档不知道p元素的id属性是XML ID类型(是吗?)。您可以使用getChildNodes()和其他DOM遍历功能导航到DOM中的节点,并尝试调用Attr.isId()id属性来确定。
p
getChildNodes()
Attr.isId()
从getElementById javadoc:
DOM实现应使用属性Attr.isId来确定属性是否为ID类型。 注意:除非如此定义,否则名称为“ ID”或“ id”的属性不是ID类型。
DOM实现应使用属性Attr.isId来确定属性是否为ID类型。
注意:除非如此定义,否则名称为“ ID”或“ id”的属性不是ID类型。
如果要使用DocumentBuilderXML将XML解析为DOM,请确保setSchema(schema)在调用newDocumentBuilder()之前先调用DocumentBuilderFactory,以确保从工厂获得的生成器知道元素类型。
setSchema(schema)