XML & XPath. Help!

UPS

Новичок
XML & XPath. Help!

PHP:
$xml = new DOMDocument (  );
$xml->load ( $MICROKERNEL->ROOT.$MICROKERNEL->CONF_GLOBAL['SKINS_PATH'].'default/templates/global.xml' );

$xsl = new DOMDocument (  );
$xsl->load ( $MICROKERNEL->ROOT.$MICROKERNEL->CONF_GLOBAL['SKINS_PATH'].'default/stylesheets/global.xsl' );

$proc = new XSLTProcessor (  );
$proc->importStylesheet ( $xsl );

$doc = $proc->transformToDoc ( $xml );



...



$html = $doc->saveHTML (  );
Перед троеточием получается документ DOM. В глубине этого дерева находится какой-то элемент с текстом "#%INFO_BLOCKS%#" (без кавычек). Необходимо в дерево вместо текста элемента вставить другой текст, но именно на этом этапе. Вопрос: как?
 

chameleon

Новичок
Ты не указал никаких дополнительных сведений о возможном местоположении данной метки, то вот тебе самый тупой запрос (при условии что в содержимом _только_ этот текст):
$XPath = "//node()[text() = '#%INFO_BLOCKS%#']";
как я понял тебя только Xpath интересует и что с ним дальше делать знаешь?
 

UPS

Новичок
chameleon
Спасибо!

делаю так:
PHP:
$xpath = new DOMXPath ( $doc );
$ibdoc = $xpath->query ( '//node()[text() = "#%INFO_BLOCKS%#"]' );
print_r ( $ibdoc );
Выдает: DOMNodeList Object ( )
Почему так, даже если в запросе '/'?

Если возможно, объясните пожалуйста как делать правильно запрос XPath (какими средствами DOMXPath или SimpleXML) и что с ним дальше делать, т.е. как мне вставить на место этой метки новую ветвь дерева (т.е. добавть другой документ DOM)?
 

chameleon

Новичок
к твоему примеру:
PHP:
$new_node = $doc->createElement('newNode');
$cdata = $doc->createCDATASection('Text to insert in utf-8');
$new_node->appendChild($cdata);
$ibdoc->item(0)->parentNode->replaceChild($new_node,$ibdoc->item(0));
а вообще это уже RTFM...
 

slach

Новичок
а что он тебе еще должен выдавать???

ты делаешь xPath запрос... xPath запрос возвращает набор нод
по которым можно пройтись вытащить их nodeValue и заменить его на нужный

тебя str_replace научить пользоваться чтоли?
 

UPS

Новичок
Я знаю, что он должен возвращать набор нод, а он
Выдает: DOMNodeList Object ( )
т.е. ПУСТОЙ объект. И так при любои запросе! Вот почему так - я не догоняю.
а добавив вышеуказанный код
PHP:
$new_node = $doc->createElement('newNode'); 
$cdata = $doc->createCDATASection('Text to insert in utf-8'); 
$new_node->appendChild($cdata); 
$ibdoc->item(0)->parentNode->replaceChild($new_node,$ibdoc->item(0));
получил
Notice: Trying to get property of non-object in 'some_file' on line 133

Fatal error: Call to a member function replaceChild() on a non-object in 'some_file' on line 133
строка 133 - последняя строка кода выше.
 

chameleon

Новичок
т.е. ПУСТОЙ объект. И так при любои запросе! Вот почему так - я не догоняю.
ты уверен что у тебя $doc (т.е. результат первой трасформации) не пустой?
кинь кусок результирующего дерева с элементом, который ты потом с помощью XPath пытаешься найти...
 

UPS

Новичок
crocodile2u
Судя по результатат print_r и так видно, но на всякий случай проверил - пусто, т.е. твой код ничего не выводит, следовательно нет ни одного нода.
chameleon
Странно, но $doc действительно пустой. Хотя после трансформации производится
PHP:
$html = $doc->saveHTML (  );
, где результат преобразования - html документ, действительно такой, какой и ожидался.

-~{}~ 19.10.05 20:07:

Все работает. Запрос составил немного иначе.
Толко вот я не понял, почему из
...
<table cellpadding="0" cellspacing="0" width="100%"><tr>
<td width="250" valign="top">
#%INFO_BLOCKS%#
</td>
<td class="common" width="10"></td>
...
получается
...
<table cellpadding="0" cellspacing="0" width="100%"><tr>
<newNode>Text to insert in utf-8</newNode><td class="common" width="10"></td>
...
Мне же нужно было добавть новое дерево (в данном примере заменить текст) в элемент ( в данном случае <td>), а не сам элемент заменить. Как?

-~{}~ 21.10.05 21:52:

ну и...
 
Сверху