Как правильно парсить xml с русскими тегами?

Статус
В этой теме нельзя размещать новые ответы.

rasandrey

Участник
Регистрация
2 Апр 2009
Сообщения
214
Реакции
6
В общем парсить xml через SAX с латинскими символами в тегах у меня получается, все работает как нужно(скрипт и xml прикрепил к письму), но есть XML файл c русскими символами, его он парсить отказывается этим же способом, объясните почему или посоветуйте правильный вариант.
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<!--СЕКЦИЯ СКЛАДЫ-->
<Склады>
	<ЭлементСклада>
		<Наименование>Склад Москва</Наименование>
		<СрокПоставки>0</СрокПоставки>
		<ДатаОбновления>2010-06-09</ДатаОбновления>
	</ЭлементСклада>
	<ЭлементСклада>
		<Наименование>Склад № 6</Наименование>
		<СрокПоставки>1</СрокПоставки>
		<ДатаОбновления>2010-06-09</ДатаОбновления>
	</ЭлементСклада>
</Склады>
 

Вложения

  • www.rar
    2,3 KB · Просмотры: 3
есть какие сообщения об ошибках?

а simplexml распарсил
PHP:
<?
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!--СЕКЦИЯ СКЛАДЫ-->
<Склады>
    <ЭлементСклада>
        <Наименование>Склад Москва</Наименование>
        <СрокПоставки>0</СрокПоставки>
        <ДатаОбновления>2010-06-09</ДатаОбновления>
    </ЭлементСклада>
    <ЭлементСклада>
        <Наименование>Склад № 6</Наименование>
        <СрокПоставки>1</СрокПоставки>
        <ДатаОбновления>2010-06-09</ДатаОбновления>
    </ЭлементСклада>
</Склады>
XML;

$xml = new SimpleXMLElement($xmlstr);

echo '<pre>';
print_r($xml);
echo '</pre>';
?>
Код:
SimpleXMLElement Object
(
    [ЭлементСклада] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Наименование] => Склад Москва
                    [СрокПоставки] => 0
                    [ДатаОбновления] => 2010-06-09
                )

            [1] => SimpleXMLElement Object
                (
                    [Наименование] => Склад № 6
                    [СрокПоставки] => 1
                    [ДатаОбновления] => 2010-06-09
                )

        )

)
 
есть какие сообщения об ошибках?
а simplexml распарсил
PHP:
<?
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!--СЕКЦИЯ СКЛАДЫ-->
<Склады>
    <ЭлементСклада>
        <Наименование>Склад Москва</Наименование>
        <СрокПоставки>0</СрокПоставки>
        <ДатаОбновления>2010-06-09</ДатаОбновления>
    </ЭлементСклада>
    <ЭлементСклада>
        <Наименование>Склад № 6</Наименование>
        <СрокПоставки>1</СрокПоставки>
        <ДатаОбновления>2010-06-09</ДатаОбновления>
    </ЭлементСклада>
</Склады>
XML;
$xml = new SimpleXMLElement($xmlstr);
echo '<pre>';
print_r($xml);
echo '</pre>';
?>
Код:
SimpleXMLElement Object
(
    [ЭлементСклада] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Наименование] => Склад Москва
                    [СрокПоставки] => 0
                    [ДатаОбновления] => 2010-06-09
                )
            [1] => SimpleXMLElement Object
                (
                    [Наименование] => Склад № 6
                    [СрокПоставки] => 1
                    [ДатаОбновления] => 2010-06-09
                )
        )
)
ошибок нету никаких, в результате пустой массив. По твоему примеру: получилась бяка с кодировкой
HTML:
SimpleXMLElement Object
(
    [Р*лементСклада] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Наименование] => Склад Москва
                    [СрокПоставки] => 0
                    [ДатаОбновления] => 2010-06-09
                )

            [1] => SimpleXMLElement Object
                (
                    [Наименование] => Склад № 6
                    [СрокПоставки] => 1
                    [ДатаОбновления] => 2010-06-09
                )

        )

)
как теперь обрабатывать получившийся массив?
 
Код:
<?xml version="1.0" encoding="UTF-8"?>
<!--СЕКЦИЯ СКЛАДЫ-->
<Склады>
	<ЭлементСклада>
...
Сам файл в UTF-8 кодировке сохранен?
И дабы не было бяк с кодировками, надо браузер переставить в UTF-8.
Обрабатывать такие массивы можно
PHP:
foreach($xml as $key => $value)
{
....код скрипта
}
если бы не кириллица, то
 
хороше, допустим, у меня есть скрипт
PHP:
 <?
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!--СЕКЦИЯ СКЛАДЫ-->
<Склады>
    <ЭлементСклада>
        <Наименование>Склад Москва</Наименование>
        <СрокПоставки>0</СрокПоставки>
        <ДатаОбновления>2010-06-09</ДатаОбновления>
    </ЭлементСклада>    
    <ЭлементСклада>
        <Наименование>Склад № 6</Наименование>
        <СрокПоставки>1</СрокПоставки>
        <ДатаОбновления>2010-06-09</ДатаОбновления>
    </ЭлементСклада>
</Склады>
XML;

$xml = new SimpleXMLElement($xmlstr);

foreach ($xml as $key=>$v)
{	
	echo '<pre>';
	print_r($v);
	echo '<pre>';
}
?>

в результате
HTML:
SimpleXMLElement Object
(
    [Наименование] => Склад Москва
    [СрокПоставки] => 0
    [ДатаОбновления] => 2010-06-09
)

SimpleXMLElement Object
(
    [Наименование] => Склад № 6
    [СрокПоставки] => 1
    [ДатаОбновления] => 2010-06-09
)

Как мне теперь обратиться к каждому элементу по индексу?
Мне нужно данные занести в sql, где есть 3 поля: "sklad, srok, data"
 
Может конечно показаться странным, но попробуй так...
PHP:
//....
$xml = new SimpleXMLElement($xmlstr);
foreach ($xml as $key=>$v)
{    
    echo '<pre>';
    print_r($v);
	$query = "INSERT INTO table (sklad, srok, data) VALUES ('".$v->Наименование."','".$v->СрокПоставки."','".$v->ДатаОбновления."')";
	echo  "$query\n";
	///...выполнить запрос
    echo '<pre>';
}
Главное, что бы кодировка XML и PHP скрипта совпадали
 
там кодировка не указана на странице вот браузер ставит свою или серверную по умолчанию, можно мета тег кодировки добавить или заголовок
PHP:
header('Content-Type: text/html; charset=utf-8');

Выбирать можно как выше говорилось по индексам с foreach
PHP:
foreach ($xml as $k=>$v){
//тут цикл по всем ЭлементСклада
    foreach ($v as $k1=>$v1){
//тут цикл по всему что есть у ЭлементСклада
        print($k1.':'.$v1.'<br>');
    }
}
или напрямую по названиям объектов, а что кириллица это не важно, главное чтоб кодировка xml и скрипта обработки были одинаковые, или будут проблемы с выборкой по названиям объектов.

PHP:
echo $xml->ЭлементСклада[0]->Наименование;

foreach ($xml as $item){
    echo $item->Наименование.'<br>';
    echo $item->СрокПоставки.'<br>';
    echo $item->ДатаОбновления.'<br>';
}
загружается xml файл так
PHP:
$xml = simplexml_load_file('1.xml');
 
загружается xml файл так
PHP:
$xml = simplexml_load_file('1.xml');
Всем спасибо за помощь, разобрался, остался единственный вопрос:
код
PHP:
 <?
$xml = simplexml_load_file('skladi.xml');  

$xml = new SimpleXMLElement($xmlstr);

//echo '<pre>';
//print_r($xml);
//echo '</pre>';
foreach ($xml as $key=>$v)
{	
	echo $v->Наименование. $v->СрокПоставки. $v->ДатаОбновления.'<br />';
}
?>
Вылетает ошибка
Код:
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in Z:\home\localhost\www\index2.php:4 Stack trace: #0 Z:\home\localhost\www\index2.php(4): SimpleXMLElement->__construct('') #1 {main} thrown in Z:\home\localhost\www\index2.php on line 4
на этой строке $xml = new SimpleXMLElement($xmlstr);
 
а 4я строка как раз лишняя, "$xml = simplexml_load_file('skladi.xml');" возвращает экземпляр класса SimpleXMLElement.
Да и переменная $xmlstr не определена, поэтому и ошибка, что SimpleXMLElement не смог распарсить XML, который должен был передаться.
Если по какой-то причине надо через SimpleXMLElement, то
PHP:
$xmlstr = file_get_contets('skladi.xml');
$xml = new SimpleXMLElement($xmlstr);
Ну и не забудь проверить, существует ли файл, который пытаешься распарсить file_exists() ;)
 
ок, понял. Появился еще 1 вопрос: как быть если xml файл не содержит главного тега?
Было так:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<Склады>
<СтрокаСклады>
	<Наименование>Склад Москва</Наименование>
	<СрокПоставки>0</СрокПоставки>
	<ДатаОбновления>2010-06-10</ДатаОбновления>
</СтрокаСклады>
<СтрокаСклады>
	<Наименование>Склад № 1</Наименование>
	<СрокПоставки>2</СрокПоставки>
	<ДатаОбновления>2010-06-10</ДатаОбновления>
</СтрокаСклады>
</Склады>

Стало так:
HTML:
<?xml version="1.0" encoding="UTF-8"?>

<СтрокаСклады>
	<Наименование>Склад Москва</Наименование>
	<СрокПоставки>0</СрокПоставки>
	<ДатаОбновления>2010-06-10</ДатаОбновления>
</СтрокаСклады>
<СтрокаСклады>
	<Наименование>Склад № 1</Наименование>
	<СрокПоставки>2</СрокПоставки>
	<ДатаОбновления>2010-06-10</ДатаОбновления>
</СтрокаСклады>

При парсинге 2 варианта вылетают ошибки
Код:
Warning: simplexml_load_file() [function.simplexml-load-file]: import/sklad.xml:8: parser error : Extra content at the end of the document in Z:\home\diada\www\includes\admin\sub\conf_import.php on line 9

Warning: simplexml_load_file() [function.simplexml-load-file]: <СтрокаСклады> in Z:\home\diada\www\includes\admin\sub\conf_import.php on line 9

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in Z:\home\diada\www\includes\admin\sub\conf_import.php on line 9
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху