[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с выводом xml-документа наоборот
Yurien
Подскажите пожалуйста. Имеется следующий скрипт:


$parser = xml_parser_create("");
xml_set_element_handler( $parser, "start_handler", "end_handler" );
xml_set_character_data_handler( $parser, "character_handler" );
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
$file = file_get_contents($document);
xml_parse( $parser, $file) or die ( format_error( $parser ) );
xml_parser_free( $parser );

function start_handler( $p, $name, $atts ) {
global $open_stack;
$open_stack[] = array($name, "");

}
function character_handler( $p, $txt ) {
global $open_stack;
$cur_index = count($open_stack)-1;
$open_stack[$cur_index][1] = $open_stack[$cur_index][1] . $txt;
}

function end_handler( $p, $name) {

global $open_stack;
$el = array_pop( $open_stack );

// ОБЩИЕ ЭЛЕМЕНТЫ
// простой текст
if ( $name == "p") {
echo "<p/>$el[1]</p/>";
}
// простые ссылки
// ссылка-текст с указанием пути к ресурсу внутри сайта
if ( $name == "ahref") {
echo "<a href=rus.php?link=$el[1]>";
}
// ссылка-текст с названием страницы
if ( $name == "atext") {
echo "$el[1]</a/>";
}
// глобальная ссылка-текст к ресурсу
if ( $name == "webref") {
echo "<a href=\"$el[1]\">";
}
// текст глобальной ссылки
if ( $name == "webtext") {
echo "$el[1]</a/>";
}
// текст-постскриптум
if ( $name == "ps") {
echo "<p class=\"ps\"/>$el[1]</p/>";
}

// НОВОСТИ

// дата
if ( $name == "datenews") {
echo "<br/>";
echo "<div align=\"left\"/>";
echo "<i class=\"news\"/>$el[1]</i/>";
echo "</div/>";
}
// заголовок
if ( $name == "hnews") {
echo "<br/>";
echo "<h2 class=\"news\"/>$el[1]</h2/>";
}
// текст
if ( $name == "pnews") {
echo "<p class=\"news\"/>$el[1]</p/>";
echo "</div/>";
}
// изображения
if ( $name == "imagenews") {
echo "<img class=\"news\">$el[1]</img>";
}
if ( $name == "news") {
echo "<div class=\"news\"/>";
echo "<hr/ class=\"news\">";
echo "</div/>";
}

// КОНЦЕРТЫ

// дата
if ( $name == "dateconzert") {
echo "<br/>";
echo "<div align=\"left\">";
echo "<i class=\"conzert\"/>$el[1]</i>";
//echo "</div/>";
}
// заголовок
if ( $name == "hconzert") {
echo "<h2 class=\"conzert\"/>$el[1]</h2/>";
}
// текст
if ( $name == "pconzert") {
echo "<p class=\"conzert\"/>$el[1]</p/>";
echo "</div/>";
}
// изображения
if ( $name == "imgconzert") {
echo "<img class=\"conzerts\">$el[1]</img>";
}
if ( $name == "conzert") {
echo "<div/>";
echo "<hr/ class=\"conzert\">";
echo "</div/>";
}

// ГОСТЕВАЯ

// дата
if ( $name == "dateguest") {
echo "<br/>";
echo "<div align=\"left\"/>";
echo "<p class=\"guestdate\"/>$el[1]</p/>";
}
// имя
if ( $name == "nameguest") {
echo "<h2 class=\"guest\"/>Гость: $el[1]</h2/>";
}
// город
if ( $name == "cityguest") {
echo "<h2 class=\"guest2\"/>Страна/город: $el[1]</h2/>";
}
// текст
if ( $name == "pguest") {
echo "<p class=\"guest\"/>$el[1]</p/>";
}
// ответ администратора
if ( $name == "padmin") {
echo "<p class=\"admin\"/>$el[1]</p/>";
echo "</div/>";
}
if ( $name == "comment") {
echo "<div/>";
echo "<hr/ class=\"guest\" align=\"center\">";
echo "</div/>";
}
///////////////////////////////////////////////////////////////////////////////////
}

function format_error ( $p ) {
$code = xml_get_error_code( $p );
$str = xml_error_string( $code );
$line = xml_get_current_line_number ( $p );
return "Ошибка XML ($code): $str в строке $line";
}

Как его изменить, чтобы он выводил документ наоборот, т.е. первым выводилась информация в последнем <news>, <comment>, затем в предпоследнем, пред-предпоследнем и так до первого?

p.s.: пытался применить "array_reverse", никак не помогло - или переворачивает не те теги, или php выдает ошибки.



Спустя 5 часов, 49 минут, 15 секунд (30.01.2009 - 20:30) Sylex написал(а):
я думаю смотреть нужно где-то здесь:
PHP
$file file_get_contents($document);


p.s. для того чтобы вам больше помогали - ставим подсветку кода и урезаем код до минимума

Спустя 1 час, 22 минуты, 27 секунд (30.01.2009 - 21:52) Yurien написал(а):
Sylex, извините, просто не знал каким образом процитировать код.
Пробовал
PHP
$file file_get_contents($document);

изменить как
PHP
$file array_reverse($filetrue)
но в таком случае php выдает ошибку о том, что функция может относиться только к массиву. array_flip() тоже не помогает.

PHP
$parser xml_parser_create("");
xml_set_element_handler$parser"start_handler""end_handler" );
xml_set_character_data_handler$parser"character_handler" );
xml_parser_set_option$parserXML_OPTION_CASE_FOLDING);
$file file_get_contents($document);
xml_parse$parser$file) or die ( format_error$parser ) );
xml_parser_free$parser );

function 
start_handler$p$name$atts ) {
global 
$open_stack;
$open_stack[] = array($name"");

}
function 
character_handler$p$txt ) {
global 
$open_stack
$cur_index count($open_stack)-1;
$open_stack[$cur_index][1] = $open_stack[$cur_index][1] . $txt;
}

function 
end_handler$p$name) {

global 
$open_stack;
$el array_pop$open_stack );


Спустя -1 лет, 11 месяцев, 27 дней, 15 часов, 4 минуты, 15 секунд (2.02.2009 - 12:56) Guest написал(а):
Пожалуйста, кто-нибудь подскажите...

Спустя 7 минут, 57 секунд (2.02.2009 - 13:04) kirik написал(а):
Попробуйте заменить $file = file_get_contents($document); на $file = implode(null, array_reverse(file($document)));

Спустя 1 час, 13 минут, 35 секунд (2.02.2009 - 14:18) Sylex написал(а):
kirik
не поможет.. надо же не по строкам перевернуть smile.gif

Спустя 1 час, 15 минут, 48 секунд (2.02.2009 - 15:34) Sylex написал(а):

Спустя 3 часа, 6 минут, 26 секунд (2.02.2009 - 18:40) kirik написал(а):
Sylex, cори, не увидел smile.gif

Спустя 1 день, 1 час, 24 минуты, 13 секунд (3.02.2009 - 20:04) Guest написал(а):
Читал, пытался снова ковырять скрипт, ничего не получается.
sad.gif

Спустя 1 час, 8 минут, 16 секунд (3.02.2009 - 21:13) Sylex написал(а):
печально

Спустя 16 часов, 56 минут, 53 секунды (4.02.2009 - 14:09) Guest написал(а):
В принципе у меня есть идея, как решить эту проблему - исправить скрипт, записывающий данные в xml-документ таким образом, чтобы тег <comment> вставлялся сразу после корневого элемента <document>.

PHP
global $link$date$name$city$mail$comment$file;

$doc = new DOMDocument("1.0""UTF-8");
if(!@
$doc->load($file))
{
$root $doc->appendChild($doc->createElement("document"));
}
else
{
$root $doc->firstChild;
}

$item $root->appendChild($doc->createElement("comment"));
$telo $item->appendChild($doc->createElement("dateguest"$date));
$telo $item->appendChild($doc->createElement("nameguest"$name));
$telo $item->appendChild($doc->createElement("cityguest"$city));
$telo $item->appendChild($doc->createElement("mailguest"$mail));
$telo $item->appendChild($doc->createElement("pguest"$comment));

$doc->save($file);


но пытки над переменными при помощи insertBefore() не помогают...вообще обидно что не выходит.

Спустя 2 часа, 27 минут, 26 секунд (4.02.2009 - 16:37) Sylex написал(а):
http://www.providerz.ru/articles/php/xml-sax-dom-intro.html

думаю, там должно быть все очень понятно

Спустя 20 дней, 18 часов, 45 минут, 2 секунды (25.02.2009 - 11:22) Yurien написал(а):
Sylex, нет, не раскусил я истины. При описанном методе выдается ошибка, что с объектом нельзя работать как со строкой.
Вы не знаете, как корректно указать в скрипте вставить элемент <comment> самым первым, а не последнем (но перед <document>)?

PHP
global $link$date$name$city$mail$comment$file;

$doc = new DOMDocument("1.0""UTF-8");
if(!@
$doc->load($file))
{
$root $doc->appendChild($doc->createElement("document"));
}
else
{
$root $doc->firstChild;
}

$item $root->appendChild($doc->createElement("comment"));
$telo $item->appendChild($doc->createElement("dateguest"$date));
$telo $item->appendChild($doc->createElement("nameguest"$name));
$telo $item->appendChild($doc->createElement("cityguest"$city));
$telo $item->appendChild($doc->createElement("mailguest"$mail));
$telo $item->appendChild($doc->createElement("pguest"$comment));

$doc->save($file);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.