Кодировка(win1251) и символы( " & > < ' ) в SAX.

simbel

Новичок
Кодировка(win1251) и символы( " & > < ' ) в SAX.

Подскажите, пожалуйста, в какое место кода представленного ниже SAX-парсера нужно вставить функцию iconv("UTF-8", "windows-1251", ...), чтобы результ вывода массива $shops показывался в кирилической кодировке? Не могу понять.

И ещё вопросик, как обрабатывать символы " & > < ' , которые могут встретиться в XML-файле? Парсер представленный ниже выдаёт ошибку, если тег <url>http://allpoisk.ru/xml.plx?id=4294964705&iid=289</url> содержит символ & или тег <name>"Все для Вашей фигуры"</name> содержит символ ".

Вот не сложный SAX-парсер -

PHP:
<?php
$shops = array();
$currentShop = null;
$index = null;
function saxStartElement($parser,$name,$attrs)
{
    global $currentShop,$index;
    switch($name)
    {
        case 'list':
            $shops = array();
            break;
        case 'adv':
            $currentShop = array();
            if (in_array('id',array_keys($attrs)))
                $currentShop['id'] = $attrs['id'];
            break;
        default:
            $index = $name;
            break;
    };
}

function saxEndElement($parser,$name)
{
    global $shops,$currentShop,$index;

    if ((is_array($currentShop)) && ($name=='adv'))
    {
        $shops[] = $currentShop;
        $currentShop = null;
    };
    $index = null;
}

/function saxCharacterData($parser,$data)
{
    global $currentShop,$index;
    if ((is_array($currentShop)) && ($index))
        $currentShop[$index] = $data;
}



$parser = xml_parser_create();
xml_set_element_handler($parser,'saxStartElement','saxEndElement');
xml_set_character_data_handler($parser,'saxCharacterData');
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,false);
$xml = join('',file('shops.xml'));
if (!xml_parse($parser,$xml,true))
    die(sprintf('Ошибка XML: %s в строке %d',
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
xml_parser_free($parser);
?>
<pre><?print_r($shops)?></pre>
Этим парсером нужно обработать простой XML-документ -

Код:
<?xml version="1.0" encoding="windows-1251" ?> 
<list>
    <adv id="3688">
        <name>"Все для Вашей фигуры"</name> 
        <url>[url]http://allpoisk.ru/yaml.plx?id=4294964705&iid=3688[/url]</url> 
    </adv>
    <adv id="289">
        <name>DOM 220v интернет-магазин</name> 
        <url>[url]http://allpoisk.ru/xml.plx?id=4294964705&iid=289[/url]</url> 
    </adv>
    <adv id="823">
        <name>07.RU</name> 
        <url>[url]http://allpoisk.ru/xml.plx?id=4294964705&iid=823[/url]</url> 
    </adv>
</list>

Буду очень благодарен за помощь, заранее спассибо!
 

Wicked

Новичок
simbel
1) $currentShop[$index] = $data; - сюда наверное.
2) тебе на эти символы ругнется любой уважающий себя XML парсер, потому что XML у тебя не well formed. Для валидации XML-файла в домашних условиях вполне подойдет internet explorer.

-~{}~ 11.07.07 20:41:

simbel
форумчане будут тебе очень признательны, если ты будешь оформлять сообщения как подобает. Пару bb-тегов
PHP:
 и [CODE] вставить не так уж и сложно.
 

simbel

Новичок
Автор оригинала: Wicked
форумчане будут тебе очень признательны, если ты будешь оформлять сообщения как подобает. Пару bb-тегов
PHP:
 и вставить не так уж и сложно.[/QUOTE]С этим я согласен. Спасибо, что подсказали. Впредь обязуюсь так и делать.  Не знал т.к. это было моё первое сообщение на этом форуме, да и вообще на форуме по теме PHP - чайник я ещё в этом деле - поэтому извеняйте за мои последующие, возможно глупые вопросы.


[QUOTE] [i]Автор оригинала: Wicked [/i]
1) $currentShop[$index] = $data; - сюда наверное.
[/QUOTE]С кодировкой разобрались, спасибо.


[QUOTE] [i]Автор оригинала: Wicked [/i]
2) тебе на эти символы ругнется любой уважающий себя XML парсер, потому что XML у тебя не well formed. Для валидации XML-файла в домашних условиях вполне подойдет internet explorer.[/QUOTE]C этим тоже разобрался, спасибо за подсказку. Этот файл я собираюсь скачивать со стороннего сайта и он уже в оригинале валидный. Просто я его как раз открылв браузере и скопировал оттуда. А при выводе в браузер "& a m p;" заменяется на "&". Отсюда и вопрос возник - вобщем моя запарка.

Возникла теперь другая ситуация - сразу не заметил. Запускаю парсер XML-файла который был представлен в выше. 
В результате этого выводится массив:
[code][SIZE=1]Array
(
    [0] => Array
        (
            [id] => 3688
            [name] => Все для Вашей фигуры"
            [url] => iid=3688
        )

    [1] => Array
        (
            [id] => 289
            [name] => интернет-магазин
            [url] => iid=289
        )

    [2] => Array
        (
            [id] => 823
            [name] => 07.RU
            [url] => iid=823
        )

)[/SIZE][/code]  

Хотя по идее вывод должен быть следующим:
[code][SIZE=1]Array
(
    [0] => Array
        (
            [id] => 3688
            [name] => "Все для Вашей фигуры"
            [url] => http://allpoisk.ru/yaml.plx?id=4294964705&iid=3688
        )

    [1] => Array
        (
            [id] => 289
            [name] => DOM 220v интернет-магазин
            [url] => http://allpoisk.ru/xml.plx?id=4294964705&iid=289
        )

    [2] => Array
        (
            [id] => 823
            [name] => 07.RU
            [url] => http://allpoisk.ru/xml.plx?id=4294964705&iid=823
        )

) [/SIZE][/code]  
Почему так происходит и как это можно исправить? Мне нужно что бы данные в массив выводились полностью т.к. потом они будут забиваться в базу данных. А в БД такие данные, которые выводятся сейчас бессмысленны. Какие функции могут поспособствовать в решении такой задачи?
 

olpa

Новичок
Какие функции могут поспособствовать в решении такой задачи?
Поможет функция внимательного чтения описания функции saxCharacterData. Парсер не обязан давать текст целиком, он может разбивать его на кусочки. Что в данном случае и делает.
 

simbel

Новичок
Я знаю, что он не обязан. Спрашивал каким образом можно сделать так, чтобы парсер давал полную строку.

Я вобщем-то справился с этой задачей поставив точку(операцию конкатенации строк).

$currentShop[$index] .= $data;,

но вылезло предупреждение

"Notice: Undefined index: name in z:\home\my_work\www\papser.php on line 88

Notice: Undefined index: url in z:\home\my_work\www\papser.php on line 88".

Критично ли это? И если да, то как это можно исправить?
 

simbel

Новичок
Спасибо всем за помощь, задача решена. Вопросы сняты.
 
Сверху