Привет, я делаю RSS-ридер, и я использую DOM.
Теперь я застрял, пытаясь изменить порядок элементов в DOMNodeList.
Я могу сделать это с двумя циклами – один, чтобы сделать его как массив, а другой для rsort () .
Есть ли способ изменить порядок в DOMNodeList или должен быть выполнен с помощью «метода массива»?
Не существует способа обращения вспять списка DOMNodeList.
Но вы можете сохранить его таким, какой он есть, и если вам это нужно, пройдитесь через него от конца до самого начала.
Пример:
<?php $doc=new DOMDocument; $doc->loadXML(' <div> <span>1 <span>2 <span>3 </span> </span> </span> </div>'); $nodeList=$doc->getElementsByTagName('span'); for($n=$nodeList->length-1;$n>=0;--$n) { echo $nodeList->item($n)->firstChild->data;//returns 321 } ?>
Просто укажите в конце NodeList, используя NodeList-> length , затем уменьшите индекс и получите доступ к NodeList-> item (index)
Почему бы вам не сделать это на стороне клиента, используя javascript? Код для данного узла n:
function reverse(n) { // Reverses the order of the children of Node n var f = document.createDocumentFragment( ); // Get an empty DocumentFragment while(n.lastChild) // Loop backward through the children, f.appendChild(n.lastChild); // moving each one to the DocumentFragment n.appendChild(f); // Then move them back (in their new order) }
Альтернатива использованию documentFragment (которая может закончиться нежелательным префиксом пространства имен по умолчанию: "): клонировать NodeList, перенести все элементы в клон, а затем заменить исходный узел:
function reverseNodeList($nodeList) { // clone the original node $reverseNodeList = $nodeList->cloneNode(); // move all nodes off the bottom of the original list onto the new one while ($nodeList->lastChild) $reverseNodeList->appendChild($nodeList->lastChild); // replace the original node with the new one $nodeList->parentNode->replaceChild($reverseNodeList, $nodeList); }