DOM getElementById - не работает?

Solid

Drosera anglica
DOM getElementById - не работает?

Просто анамалия какая-то... в $n записывается null;
PHP:
$index_dom = new DOMDocument();
$index_dom->loadXML('<x><x id="asd">asda</x><z/></x>');
$n = $index_dom->getElementById('asd');
-~{}~ 18.01.07 19:46:

PS. Хитрее некуда: http://blog.bitflux.ch/wiki/GetElementById_Pitfalls
 

Wicked

Новичок
[offtopic]
http://php5.bitflux.org/xmlonspeed/slide_24.php

В суть проблемы не вникал, но что-то мне подсказывает, что для заявленных ID-полей просто строится и поддерживается что-то типа хэш-таблицы или дерева. Отсюда и скорость.
[/offtopic]
 

Alexandre

PHPПенсионер
Wicked Если интересна специфика libxml.

Для того чтоб работал метод $index_dom->getElementById('asd'); должен быть "обозначен" аттрибут id либо с помощью DTD (Хитрее некуда: http://blog.bitflux.ch/wiki/GetElementById_Pitfalls
) либо непосредственно в коде с помощью xmlAddId( Node , idValue ). Соответственно поиск по GetElementById идет быстрее, так как механизм поиска осуществлен на списковом просмотре структур, описывающих аттрибут id (каждая структура создается методом xmlAddId).
ТО же относится и к выбору узлов xpointer(#idValue) - не работает без xmlAddId, хотя отлично работает с xpointer(full/node/path[id='idValue'])
 

Solid

Drosera anglica
Alexandre
А что касательно валидности XHTML документа, если использовать xml:id="someId"? Пропустит ли его validator или отобразит xml:id как ошибочный атрибут?

-~{}~ 19.01.07 11:22:

PS. Валидатор находит такую запись невалидной... Через JS функцию document.getElementById() доступ к атрибуту xml:id осуществить нельзя.
 

Alexandre

PHPПенсионер
PS. Валидатор находит такую запись невалидной...
вполне логично, т.к. не объявлено пространство имен xml. Еще не известно в соответствии какой логики работает валидатор.

Через JS функцию document.getElementById() доступ к атрибуту xml:id осуществить нельзя
вполне логично, так как getElementById() ищет по Id.

я описал причины специфики реализации libxml(или бага ).

Ясно, что JS не использует libxml, соответственно и не находит.

dom->getElementById('asd') использует алгоритм поиска путем использования XPointer, а тот в свою очередь осуществляет просмотр структур, которые создаются либо при парсинге DTD либо непосредственно в коде с помощью xmlAddId( Node , idValue ).
 
Сверху