PHP DOMDocument: insertBefore, как заставить это работать? - PullRequest
5 голосов
/ 02 августа 2010

Я хотел бы разместить новый элемент узла перед данным элементом. Я использую insertBefore для этого, но безуспешно!

Вот код,

<DIV id="maindiv">

<!-- I would like to place the new element here -->

<DIV id="child1">

    <IMG />

    <SPAN />

</DIV>

<DIV id="child2">

    <IMG />

    <SPAN />

</DIV>

//$div is a new div node element,
//The code I'm trying, is the following:

$maindiv->item(0)->parentNode->insertBefore( $div, $maindiv->item(0) ); 

//Obs: This code asctually places the new node, before maindiv
//$maindiv object(DOMNodeList)[5], from getElementsByTagName( 'div' )
//echo $maindiv->item(0)->nodeName gives 'div'
//echo $maindiv->item(0)->nodeValue gives the correct data on that div 'some random text'
//this code actuall places the new $div element, before <DIV id="maindiv>

http://pastie.org/1070788

Любая помощь приветствуется, спасибо!

Ответы [ 3 ]

5 голосов
/ 02 августа 2010

Если maindiv из getElementsByTagName(), то $maindiv->item(0) - это div с id = maindiv.Итак, ваш код работает правильно, потому что вы просите его поместить новый div перед maindiv.

Чтобы он работал так, как вы хотите, вам нужно получить детей maindiv:

$dom = new DOMDocument();
$dom->load($yoursrc);
$maindiv = $dom->getElementById('maindiv');
$items = $maindiv->getElementsByTagName('DIV');
$items->item(0)->parentNode->insertBefore($div, $items->item(0));

Обратите внимание, что если у вас нет DTD, PHP ничего не возвращает с getElementsById.Чтобы getElementsById работал, вам нужно иметь DTD или указать, какие атрибуты являются идентификаторами:

foreach ($dom->getElementsByTagName('DIV') as $node) {
    $node->setIdAttribute('id', true);
}
0 голосов
/ 02 августа 2010

С нуля, это тоже похоже на работу:

$str = '<DIV id="maindiv">Here is text<DIV id="child1"><IMG /><SPAN /></DIV><DIV id="child2"><IMG /><SPAN /></DIV></DIV>';
$doc = new DOMDocument();
$doc->loadHTML($str);
$divs = $doc->getElementsByTagName("div");
$divs->item(0)->appendChild($doc->createElement("div", "here is some content"));
print_r($divs->item(0)->nodeValue);
0 голосов
/ 02 августа 2010

Нашел решение,

            $child = $maindiv->item(0);

            $child->insertBefore( $div, $child->firstChild ); 

Я не знаю, насколько это имеет смысл, но хорошо, сработало.

...