javadoc для Document
класс имеет следующее примечание под getElementById
.
Примечание: Атрибуты с именем "идентификатор" или "идентификатор" не имеют идентификатора типа если так определены
Так, я прочитал документ XHTML в DOM (использующий Xerces 2.9.1).
Документ имеет простое <p id='fribble'>
в нем.
Я звоню getElementById("fribble")
, и это возвращает пустой указатель.
Я использую XPath для получения "//* [идентификатор ='fribble']", и все хорошо.
Так, вопрос, что вызывает DocumentBuilder
на самом деле отметить идентификационные атрибуты, как 'так определено?'
Чтобы вызов getElementById ()
работал, документ
должен знать типы своих узлов, а целевой узел должен иметь тип XML ID, чтобы метод мог Найди это. Он знает о типах своих элементов через связанную схему. Если схема не задана или не объявляет, что атрибут id
относится к типу XML-идентификатора, getElementById ()
никогда его не найдет.
Я предполагаю, что ваш документ не знает, что атрибут id
элемента p
имеет тип XML ID (не так ли?). Вы можете перейти к узлу в DOM, используя getChildNodes ()
и другие функции обхода DOM, и попробовать вызвать Attr.isId ()
для атрибута id, чтобы точно сказать.
Из getElementById javadoc:
Ожидается, что реализация DOM используйте атрибут Attr.isId для определить, относится ли атрибут к типу Я БЫ.
Примечание: атрибуты с именем «ID» или "id" не относятся к типу ID, если только это не так определенный.
Если вы используете DocumentBuilder
для синтаксического анализа XML в DOM, обязательно вызовите setSchema (schema)
в DocumentBuilderFactory перед вызовом newDocumentBuilder (), чтобы убедиться, что Builder, который вы получаете с завода, знает типы элементов.
Соответствующее выражение xpath на самом деле будет id('fribble')
, которое должно вернуть тот же результат, что и getElementById
. Чтобы это сработало, в dtd или схеме, связанной с вашим документом, атрибут должен быть объявлен как тип ID.
Если вы контролируете запрашиваемый xml, вы также можете попробовать переименовать атрибут в xml:id
согласно http://www.w3.org/TR/xml-id/.
Атрибут ID не является атрибутом с именем «ID», это атрибут, который объявлен как атрибут ID посредством DTD или схемы. Например, HTML 4 DTD описывает это:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">