русские буквы в xml файле

litvinenko

Новичок
русские буквы в xml файле

Доброго времени суток, знатоки!

Заранее прошу прощения. Наверняка уже что-то подобное рассматривалось в этом форуме, тогда пошу кинуть ссылку.

Проблема такая: есть xml-файл (список новостей), в котором присутствуют русские буквы.
Дело в том, что этот файл не хочет обрадатываться. Когда русских букв нет - все нормально.
Пример взят кажется из мануала по пхп.

Xml-файл test.xml
<?xml version="1.0"?>
<newsdb>
<news>
<title>в</title>
<create_time>сегодня</create_time>
<text>бла бла блаб ла
вапвапвапвап
вапвапвапвапвапвап
апвап</text>
</news>
<news>
<title>Заголовок 2</title>
<create_time>вчера</create_time>
<text>бла бла бла</text>
</news>
</newsdb>

php-файл test.php

PHP:
<?php
class Xml
{
   var $tag;
   var $value;
   var $attributes;
   var $next;
}

function xml2array($xml_string)
{
   $Parser = xml_parser_create();
   xml_parser_set_option($Parser, XML_OPTION_CASE_FOLDING, 0);
   xml_parser_set_option($Parser, XML_OPTION_SKIP_WHITE, 1);
   xml_parse_into_struct($Parser, $xml_string, $Xml_Values);
   xml_parser_free($Parser);
   $XmlClass = array();
   $LastObj = array();
   $NowObj = &$XmlClass;

   foreach($Xml_Values as $Xml_Key => $Xml_Value)
   {
       $Index = count($NowObj);

       if($Xml_Value["type"] == "complete")
       {
           $NowObj[$Index] = new Xml;
           $NowObj[$Index]->tag = $Xml_Value["tag"];
           $NowObj[$Index]->value = $Xml_Value["value"];
           $NowObj[$Index]->attributes = $Xml_Value["attributes"];
       }
       elseif($Xml_Value["type"] == "open")
       {
           $NowObj[$Index] = new Xml;
           $NowObj[$Index]->tag = $Xml_Value["tag"];
           $NowObj[$Index]->value = $Xml_Value["value"];
           $NowObj[$Index]->attributes = $Xml_Value["attributes"];
           $NowObj[$Index]->next = array();
           $LastObj[count($LastObj)] = &$NowObj;
           $NowObj = &$NowObj[$Index]->next;
       }
       elseif($Xml_Value["type"] == "close")
       {
           $NowObj = &$LastObj[count($LastObj) - 1];
           unset($LastObj[count($LastObj) - 1]);
       }
       
   }
   return $XmlClass;
}

$filename = "test.xml";
$string = file_get_contents($filename);

var_dump($string);

$Xml = xml2array($string);

var_dump($Xml);
?>
-~{}~ 27.09.06 10:17:

да. кстати. вот что выводится в броузере:

array
0 =>
object(Xml)[1]
public 'tag' => 'newsdb' (length=6)
public 'value' => null
public 'attributes' => null
public 'next' =>
array
0 =>
object(Xml)[2]
public 'tag' => 'news' (length=4)
public 'value' => null
public 'attributes' => null
public 'next' =>
array
0 =>
object(Xml)[3]
public 'tag' => 'title' (length=5)
public 'value' => null
public 'attributes' => null
public 'next' =>
array
empty
 

Wicked

Новичок
учимся дебажить xml parser :)

PHP:
$Parser = xml_parser_create(); 
xml_parser_set_option($Parser, XML_OPTION_CASE_FOLDING, 0); 
xml_parser_set_option($Parser, XML_OPTION_SKIP_WHITE, 1); 
if (!xml_parse_into_struct($Parser, $xml_string, $Xml_Values)) {
  die(sprintf("XML error: %s at line %d",
              xml_error_string(xml_get_error_code($Parser)),
              xml_get_current_line_number($Parser)));
}
xml_parser_free($Parser);
PS: в принципе, ошибка в xml-документе очевидна, но см. мою подпись ...
 

litvinenko

Новичок
отлично. да.
вот что в броузере вывелось: XML error: Invalid character at line 4

логично предположить, что эта ошибка была вызвана присутствием русских букв.

Вопрос был в том, как это исправить? Я думаю, т.е. я читал, что вроди как надо этот xml-файл перекодировать в utf-8. но я не знаю, при помощи какой функции и в каком месте (
Помогите, пожалуйста.
 

Wicked

Новичок
utf-8 использовать не обязательно. Достаточно добавить в xml документ информацию о том, что он в одной из кириллических кодировок. Например, так:
<?xml version="1.0" encoding="windows-1251"?>
 

litvinenko

Новичок
спасибо. действительно помогло :) прошу прощения за такой вопрос :)

правда теперь почему-т нужно html-страницу отобрадать в кодировке utf-8
но это уже не проблема.
еще раз спасибо!
 

Wicked

Новичок
http://www.php.net/manual/en/ref.xml.php#xml.encoding
http://www.php.net/manual/en/function.xml-parser-set-option.php

Там как раз и говорится, что "Supported target encodings are ISO-8859-1, US-ASCII and UTF-8."

Соответственно, можно использовать всякие iconv, mb_string и т.д. для конвертирования в windows-1251.

Еще можно отказаться от XML Parser'а в пользу DOM или SimpleXML. Точно не скажу, но они вероятно более хорошо с кодировками работают.
 

tony2001

TeaM PHPClub
всё XML-related в PHP работает через libxml, которая всегда использует UTF-8.
 

litvinenko

Новичок
да я вот тоже в мануале видел такое, но не смог к сожалению разобраться...
а вообще такой вопрос: как думаете, что лучше использовать для хранения данных, например, набора новостей или гостевой книги: обычные файлы или xml-файлы?
 

Wicked

Новичок
tony2001
ну для внутреннего представления - естественно. А перекодинг при вытаскивании данных не поддерживается?

-~{}~ 27.09.06 17:49:

litvinenko
базу данных :)
 
Сверху