Эта тема на forum.dklab.ru


reactorx: PHP5 DOM не понятное поведение replaceChild
Есть такой XML

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<title>xxx</title>
<body>
<script language="JavaScript" src="./inc/httprequest/js.js" />

<div id="page" style="border:1px dashed blue;width:100%;">
hello world!
<component file ="./sample2.xml" name="sample2" />
this is text from document!
<component file ="./sample2.xml" name="sample" />
</div>
<br/>
<div id="debug" style="border:1px dashed red;width:100%;">
Debug info:<br/>
</div>


<script language="JavaScript" src="./inc/starter.js" />
</body>
</html>


есть такая функция которая обрабатывает данный xml документ....
все казалось бы просто!

function parse_document($f_name) {

if(!$doc = DOMDocument::load($f_name)) {
echo "cant open [$f_name]\n";
return false;
}

$component_div_node = $doc->createElement('div');
$component_div_node->appendChild($doc->createTextNode(MSG_COMPONENT_LOADING));

$component_tags = $doc->getElementsByTagName('component');

foreach ($component_tags as $component_tag) {
$component_name = $component_tag->getAttribute('name');
echo $component_name."/";
$component_div_node->setAttribute('id', $component_name);
$component_div_node->setAttribute('type', 'component');

$component_tag->parentNode->replaceChild($component_div_node, $component_tag);
}

return $doc;
}


В чем собственно говоря проблема:
в XML документе имеется такие тэги <component file ="./sample2.xml" name="sample2" /> и <component file ="./sample2.xml" name="sample" />
Функция по задумки должна находить эти теги и подменять их на тэг div...
Что же происходит: при работе данной функции происходит ситуация что функция находит первый из тегов component встречающийся в XML документе и подменяет его (т.е до этого момента все отлично)... но подменив этот тег почемуто сразу же вываливается из foreach...
т.е подмена второго тега не происходит...
Уважаемые господа если у кого то есть мысли по данному поводу поделитесь...
Порылся по докам по форумам... нарыл кучу стандартных примеров ... в которых подменяется один из элементов документа... Да действительно они работают... но в моем случае мне нужно подменять все встречающиеся теги... и все сделал по аналогии примеров... но как вы видете не работает...
Мои мысли по данному поводу: Перечитав доки я наткнулся на такой момент... что если данный тег уже присутствует в ноде... то грубо говоря замены происходить не будет... не совсем понятно мне это выражение ... т.е как в моем случае ??? если я первый тег подменил то второй подменяться не будет? тогда как же быть??? логически это звучит глупо...
Еще одна проблема которая не дала мне сегодня спать спокойно))) это почему оно вываливается из foreach ?
Буду рад всем коментам!
reactorx:
Огромное спасибо все кто проявил рвение, интерес и тп. в решении проблемы...ваши усилия родина не забудет)!
собственно я ее решил сам)

Вот она сакроментальная фраза
If you are trying to replace more than one node at once, you have to be careful about iterating over the DOMNodeList. If the old node has a different name from the new node, it will be removed from the list once it has been replaced. Use a regressive loop:


кому вдруг станет интересно в чем же дело стукайте поясню)))
вечно ваш!
66
Maus:
Тема закрыта.

Эта тема на forum.dklab.ru