Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с CDATA, и предопределёнными сущностями 
:(
    Опции темы
Bikutoru
Дата 6.10.2005, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Здраствуйте, есть такой обработчик XML:
Код


function YML_openTag($xml_parser, $node, $paramArray)
{
    print '<br />Start of ' . $node;
}


function YML_closeTag($xml_parser, $node)
{
    print '<br />Finish of ' . $node;
}


function YML_CDataSection($xml_parser, $data)
{
    print '<br />CDATA: "' . $data . '"';
}


$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE,   1);

xml_set_element_handler($xml_parser, 'YML_openTag', 'YML_closeTag');
xml_set_character_data_handler($xml_parser, 'YML_CDataSection');

//Пример XML-кода

$xml_code = <<<XML
<?xml version="1.0" ?>
<offer>
  <elem>Simple data</elem>Out of tag
  <url>http://www.hfree.ru/?partnID=marketyandex&amp;g=656</url>
  <node>Some text about nothing</node>
</offer>
XML;

if (!xml_parse($xml_parser, $xml_code))
    die(sprintf('<p>Parse error: <b>"%s"</b> at line #%d</p>',
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));

xml_parser_free($xml_parser);


С ним возникает следующая проблема: при передаче урла http://www.site.ru/?partnID=marketyandex&g=656, который по логике является одной CDATA-секцией, оно разбивает его на 3 части
Цитата

CDATA: "http://www.hfree.ru/?partnID=marketyandex"
CDATA: "&"
CDATA: "g=656"


А вопрос мой заключается в следующем: можно ли, "играясь" со свойствами парсера (без модификаций функций-обработчиков), сделать так, чтобы этот урл стал одной CDATA-секцией?
Заранее спасибо.

Это сообщение отредактировал(а) Bikutoru - 6.10.2005, 10:21


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Bikutoru
Дата 6.10.2005, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Решил проблему так:
Код

<?php

class Stack
{
    var $container = array();

    function push($value)
    {
        array_unshift($this->container, $value);
    }

    function pop()
    {
        return array_shift($this->container);
    }

    function top()
    {
        return $this->container[0];
    }
}


$TagStack = new Stack;


function YML_openTag($xml_parser, $node, $paramArray)
{
    $GLOBALS['TagStack']->push($node);

    // Tag procession
    print '<br />Start of "' . $node . '"';
}


function YML_closeTag($xml_parser, $node)
{
    $GLOBALS['TagStack']->pop(); // Delete last tag from stack
    YML_CDataSection($xml_parser, '');

    // Tag processing
    print '<br />Finish of "' . $node . '"';
}


function YML_CDataSection($xml_parser, $data)
{
    static $section_tag   = '';
    static $section_value = '';

    if ($section_tag != $GLOBALS['TagStack']->top())
    {
        if ($section_value)
        {
            // Value procession
            print '<br />CData: "' . $section_value . '" in ' . $section_tag;
        }

        $section_value = '';
        $section_tag   = $GLOBALS['TagStack']->top();
    }

    if (!$data)
        return;

    $section_value .= $data;
}



$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE,   1);

xml_set_element_handler($xml_parser, 'YML_openTag', 'YML_closeTag');
xml_set_character_data_handler($xml_parser, 'YML_CDataSection');
#xml_set_default_handler($xml_parser, 'YML_something');

/*
<offer>
  <elem>Simple data</elem>Out of tag
  <url>http://www.hfree.ru/?partnID=marketyandex&amp;g=656</url>
  <node>Some text about nothing</node>
</offer>
*/

$xml_code = <<<XML
<?xml version="1.0" ?>
<offer>
 <elem>Simple data</elem>y
 <url>http://www.hfree.ru/?partnID=marketyandex&amp;g=656</url>
 -&quot;56ghj&apos;-
</offer>
XML;

if (!xml_parse($xml_parser, $xml_code))
    die(sprintf('<p>Parse error: <b>"%s"</b> at line #%d</p>',
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));

xml_parser_free($xml_parser);

?>

но вопрос остаётся открытым...

Это сообщение отредактировал(а) Bikutoru - 6.10.2005, 10:57


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: X технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.