Java XML DOM: как идентификационные Атрибуты являются особенными?

javadoc для Document класс имеет следующее примечание под getElementById.

Примечание: Атрибуты с именем "идентификатор" или "идентификатор" не имеют идентификатора типа если так определены

Так, я прочитал документ XHTML в DOM (использующий Xerces 2.9.1).

Документ имеет простое <p id='fribble'> в нем.

Я звоню getElementById("fribble"), и это возвращает пустой указатель.

Я использую XPath для получения "//* [идентификатор ='fribble']", и все хорошо.

Так, вопрос, что вызывает DocumentBuilder на самом деле отметить идентификационные атрибуты, как 'так определено?'

19
задан bmargulies 6 August 2010 в 11:45
поделиться

3 ответа

Чтобы вызов 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, который вы получаете с завода, знает типы элементов.

17
ответ дан 30 November 2019 в 01:58
поделиться

Соответствующее выражение xpath на самом деле будет id('fribble'), которое должно вернуть тот же результат, что и getElementById. Чтобы это сработало, в dtd или схеме, связанной с вашим документом, атрибут должен быть объявлен как тип ID.

Если вы контролируете запрашиваемый xml, вы также можете попробовать переименовать атрибут в xml:id согласно http://www.w3.org/TR/xml-id/.

3
ответ дан 30 November 2019 в 01:58
поделиться

Атрибут ID не является атрибутом с именем «ID», это атрибут, который объявлен как атрибут ID посредством DTD или схемы. Например, HTML 4 DTD описывает это:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
4
ответ дан 30 November 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: