Вывод дерева (туплю по-черному)

HAGer

Новичок
Вывод дерева (туплю по-черному)

есть XML

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE doc SYSTEM "./dtd/dtd.dtd">
<doc>
<col id="col1">
<razdel name="Конференции iXBT" id="raz1">
<link url="http://www.ixbt.com/" title="iXBT" color="">iXBT</link>
<link url="http://forum.ixbt.com/?id=all" title="iXBT" color="">Список последних сообщений</link>
<link url="http://forum.ixbt.com/?id=24" title="iXBT" color="">Программы: Интернет</link>
<link url="http://forum.ixbt.com/?id=15" title="iXBT" color="">Флейм</link>
</razdel>

</col>
</doc>

я его разбираю таким образом:
PHP:
$xmlpath = dirname(__FILE__) . "\\";
if (!$xmldoc = domxml_open_file( $xmlpath . "test.xml",DOMXML_LOAD_DONT_KEEP_BLANKS)) {
  echo "Error while parsing the document\n";
  exit;
}

$root = $xmldoc->document_element();
$root_child = $root->child_nodes();

function nodeit($node)
{
	for($i=0;$i<sizeof($node);$i++)
	{
		print $node[$i]->node_name()."<br>";
		nodeit($node[$i]->child_nodes());
	}
}

nodeit($root_child);
выдает мне следущее:
col
razdel
link
#text
link
#text
link
#text
link
#text

Внимание вопрос:
Че такое #text и как его из списка тегов прибить?


У меня этой пакости (#text) было еще больше, пока не прописал DOMXML_LOAD_DONT_KEEP_BLANKS...
Я совсем чайник, просьба ногами в живот не бить. Форум поковырял, ниче такого не нашел. Мож сказывается ночь... :rolleyes:
 

chameleon

Новичок
;)..#text - это текстовый узел
из твоего примера:
PHP:
 <link url="http://forum.ixbt.com/?id=all" title="iXBT" color="">Список последних сообщений</link>
#text = 'Список последних сообщений';
 

HAGer

Новичок
Автор оригинала: chameleon
;)..#text - это текстовый узел
понятно. Ну а как с этим работать-то?

Какие вообще методы работы с узлами в XML используются? В том смысле, что удобнее по имени тегов работать или по позиции или еще как?
 

HAGer

Новичок
chameleon
да это понятно.

просто, если работать с деревом через ту функцию, что я привел, но вмесо $node[$i]->node_name() делать например $node[$i]->node_get attribute('name'), то вываливается ошибка обращения к non-object'у... соответственно, скрипт спотыкается на #text

А как автоматизировать этот момент, непонятно? Или я обязательно должен знать структуру xml документа и четко прописывать, что вот если тег razdel, то делать с ним то-то и то-то? Не погу я просто вывести содержимое xml документа, не зная названий его тегов?
 

HAGer

Новичок
намек ясен

-~{}~ 06.02.06 22:37:

ковыряясь дальше вот, что получается

вызывая функцию $dvd_children[$j]->node_type() я получаю определенный тип узла. Так например, указанный выше #text будет равен цифре "3". Итак имеем код:

PHP:
for($j=0;$j<sizeof($dvd_children);$j++)
		{
			
			if($dvd_children[$j]->node_type() == 3)
			{
				$str = $dvd_children[$j]->[B]get_content()[/B];
				
				print iconv("UTF-8","windows-1251",$str)."<br>";
			}
		}
При это получаю чистый лист. Я не понял, как #text прочитаьт. Он все равно рассматривается как объект... вот с XML_ELEMENT_NODE фокус get_content() проходит и он выводит именно контент того, что надо. как вывести текст из #text?
 

Profic

just Profic (PHP5 BetaTeam)
->node_value() очевидно.
Вообще советую прочитать специфиацию на DOM2, чтобы хотя бы примерно представлять что, где и как. А еще лучше пересесть на php5 :) - там реализация соответствует спецификации.
 

HAGer

Новичок
Profic
Ну, на РНР5 пересесть не могу, ибо у хостера РНР 4.4.*

node_value() также выдает пустую строку
 

Profic

just Profic (PHP5 BetaTeam)
node_value() или iconv()?
Для DomText (DomNode типа TextNode - node_type() == XML_TEXT_NODE) node_value() должен возвращать текст, содержащийся в этом узле. Если то не так, то его там нет или iconv() глючит.
 

HAGer

Новичок
iconv() не глючит. Я пробовал выводить без него.

сам файл содержит данные такого вида

<data>Какие-то данные</data>

так вот, я так понимаю, что здесь у нас узлы разных типов. Есть XML_ELEMENT_NODE - это <data>, а есть текстовый узел XML_TEXT_NODE - #text = "Какие-то данные".
Я правильно ситуацию разумею?
 

HAGer

Новичок
Profic
Ну вот. Значит я должен (и делаю) вычислить этот самый текстнод и вывести его значение. Я так и делаю. Не выводит. Почему-то.

Вышел из ситуации только лишь запрашивая контент родительского элементнода... но это не решение проблемы, это пусть её обойти
 

Profic

just Profic (PHP5 BetaTeam)
Четверки у меня, потому проверить не могу. Если что-то работает не так, значит что-то делается не так.

PHP:
for ($j = 0; $j < sizeof($dvd_children); $j++) { 
    if ($dvd_children[$j]->node_type() == XML_TEXT_NODE) { 
        $str = $dvd_children[$j]->node_value(); 
        print $str . '<br>'; 
        print iconv('UTF-8', 'WINDOWS-1251', $str) . '<br>'; 
    } 
}
Если это не работает, то ой.
 

Voldar

Новичок
Если вопрос именно в выводе информации, то почему-бы не использовать xslt?
 

HAGer

Новичок
Voldar
методов вывода инфы много. Сейчас вопрос принципиальный. Оно должно работать и не работает
 

Voldar

Новичок
Попробуй убрать DTD. Проверил вариант Profic-а, работает.
 

HAGer

Новичок
Voldar
Не понял. А в чем суть сего шага? По логике вещей, наоборот, DTD должён помогать

(щас пока не могу ниче сделать, завтра)
 
Сверху