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

Тема в разделе "PHP", создана пользователем rasandrey, 9 июн 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. rasandrey

    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 КБ
      Просмотров:
      3
  2. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    есть какие сообщения об ошибках?

    а 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
                    )
    
            )
    
    )
    
    
     
  3. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    ошибок нету никаких, в результате пустой массив. По твоему примеру: получилась бяка с кодировкой
    HTML:
    SimpleXMLElement Object
    (
        [Р*лементСклада] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [Наименование] => Склад Москва
                        [СрокПоставки] => 0
                        [ДатаОбновления] => 2010-06-09
                    )
    
                [1] => SimpleXMLElement Object
                    (
                        [Наименование] => Склад № 6
                        [СрокПоставки] => 1
                        [ДатаОбновления] => 2010-06-09
                    )
    
            )
    
    )
    
    как теперь обрабатывать получившийся массив?
     
  4. jo0o00nyy

    jo0o00nyy Постоялец

    Регистр.:
    12 май 2010
    Сообщения:
    65
    Симпатии:
    27
    Код:
    <?xml version="1.0" encoding="UTF-8"?>
    <!--СЕКЦИЯ СКЛАДЫ-->
    <Склады>
    	<ЭлементСклада>
    ...
    Сам файл в UTF-8 кодировке сохранен?
    И дабы не было бяк с кодировками, надо браузер переставить в UTF-8.
    Обрабатывать такие массивы можно
    PHP:
    foreach($xml as $key => $value)
    {
    ....
    код скрипта
    }
    если бы не кириллица, то http://www.spravkaweb.ru/php/datafun/xml/simplexml
     
  5. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    хороше, допустим, у меня есть скрипт
    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"
     
  6. jo0o00nyy

    jo0o00nyy Постоялец

    Регистр.:
    12 май 2010
    Сообщения:
    65
    Симпатии:
    27
    Может конечно показаться странным, но попробуй так...
    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 скрипта совпадали
     
    rasandrey нравится это.
  7. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    там кодировка не указана на странице вот браузер ставит свою или серверную по умолчанию, можно мета тег кодировки добавить или заголовок
    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');
     
    rasandrey нравится это.
  8. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    Всем спасибо за помощь, разобрался, остался единственный вопрос:
    код
    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);
     
  9. jo0o00nyy

    jo0o00nyy Постоялец

    Регистр.:
    12 май 2010
    Сообщения:
    65
    Симпатии:
    27
    а 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() ;)
     
  10. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    ок, понял. Появился еще 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
    
     
Статус темы:
Закрыта.