Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Выпадающее меню с использованием XML


Автор: SneG0K 5.8.2009, 13:56
Есть такой XML:
Код

<?xml version="1.0" encoding="UTF-8"?>
<menu>
    <cat id="0" link="#" title="О компании">
        <sub id="0" link="#" title="Ссылка1">
        <sub id="1" link="#" title="Ссылка1">
    </cat>
    <cat id="1" link="#" title="Наши бренды">
        <sub id="0" link="#" title="Ссылка1">
        <sub id="1" link="#" title="Ссылка1">
    </cat>
</menu>


Есть функция преобразующая этот XML в это массив:
Код

Array
(
    [0] => Array
        (
            [title] => О компании 
            [link] => #
            [body] => Array
                (
                    [0] => Array
                        (
                            [title] => Ссылка 1
                            [link] => #
                        )

                    [1] => Array
                        (
                            [title] => Ссылка 2
                            [link] => #
                        )

                )

        )

    [1] => Array
        (
            [title] => Наши бренды
            [link] => #
            [body] => Array
                (
                    [0] => Array
                        (
                            [title] => Ссылка 1
                            [link] => #
                        )

                    [1] => Array
                        (
                            [title] => Ссылка 2
                            [link] => #
                        )

                )

        )

)


На сколько правильно составлен XML файл? Я просто первый раз пользуюсь XML

Добавлено через 3 минуты
И еще вопросик, чем парсить XML? 
Просто меня интересует то, что есть на всех хостингах, чтоб не пришлось потом заказчику объяснять, что да как.

Автор: icewind 5.8.2009, 14:02
Нормально составлен. 
Единственное что, это неплохо было бы закрыть одиночные тэги 
Код

<sub id="0" link="#" title="Ссылка1" />


Цитата

И еще вопросик, чем парсить XML? 

Я обычно пользуюсь SimpleXML или DOM(реже)

Автор: SneG0K 5.8.2009, 14:11
Цитата(icewind @  5.8.2009,  13:02 Найти цитируемый пост)
Я обычно пользуюсь SimpleXML или DOM(реже)

А наличие их на хостингах?

Автор: icewind 5.8.2009, 14:16
За наличие на абсолютно всех хостингах думаю никто не поручится, но встречаются достаточно часто... В конце концов есть и некрохосты с 4пхп, но на них я не ориентируюсь.

Про отсутствие парсера и выход из ситуации есть http://habrahabr.ru/blogs/php/30353/

Автор: lukas 5.8.2009, 15:39
SneG0K

SimpleXML встречается практически на всех хостингах где стоит php 5, это вообще расширение поставляется вместе с php начиная с 5ой версии.

Автор: SneG0K 5.8.2009, 21:20
Код

<?xml version="1.0" encoding="UTF-8"?>
<menu>
    <cat id="0" link="#" title="О компании">
        <sub id="0" link="#" title="Ссылка1" />
        <sub id="1" link="#" title="Ссылка1" />
    </cat>
    <cat id="1" link="#" title="Наши бренды">
        <sub id="0" link="#" title="Ссылка1" />
        <sub id="1" link="#" title="Ссылка1" />
    </cat>
</menu>

Вот на это ругается simpleXML
Код


Warning: simplexml_load_file() [function.simplexml-load-file]: core/includes/menu.xml:3: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xCE 0x20 0xEA 0xEE in \www\core\functions\functions.php on line 14

Warning: simplexml_load_file() [function.simplexml-load-file]: <cat id="0" link="#" title="О компании"> in \www\core\functions\functions.php on line 14

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in \www\core\functions\functions.php on line 14


Что делать?

Автор: icewind 6.8.2009, 00:55
А файл с xml действительно в utf8? Если в файле указана кодировка utf-8, то и сами данные должны быть в этой кодировке. Я у себя на локальном сервере проверил и все отпарсилось без проблем.

Автор: SneG0K 6.8.2009, 09:05
Да, сохранил сам файл в utf-8 вроде заработало, но
Код

О компании
Куда дальше копать?

Добавлено через 8 минут и 46 секунд
И еще, как получить доступ к атрибуту?
Код

object(SimpleXMLElement)#7 (2) {
  ["@attributes"]=>
  array(3) {
    ["id"]=>
    string(1) "0"
    ["link"]=>
    string(1) "#"
    ["title"]=>
    string(19) "Рћ компании"
  }
  ["sub"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#8 (1) {
      ["@attributes"]=>
      array(3) {
        ["id"]=>
        string(1) "0"
        ["link"]=>
        string(1) "#"
        ["title"]=>
        string(14) "Ссылка 1"
      }
    }
    [1]=>
    object(SimpleXMLElement)#9 (1) {
      ["@attributes"]=>
      array(3) {
        ["id"]=>
        string(1) "1"
        ["link"]=>
        string(1) "#"
        ["title"]=>
        string(3) "132"
      }
    }
  }
}


Код

$menu[]['title'] = $cats->attributes->title;


Автор: icewind 6.8.2009, 11:18
Вывод данных тоже должен быть в urf8. И, желательно, сам скрипт. Можно послать заголовок перед выводом
 
Код

header('Content-Type: text/html; charset=utf-8'); 



Цитата(SneG0K @  6.8.2009,  09:05 Найти цитируемый пост)
И еще, как получить доступ к атрибуту?

Код
    
echo $cats->attributes()->title;

Автор: SneG0K 6.8.2009, 13:49
Код

Array
(
    [0] => Array
        (
            [title] => SimpleXMLElement Object
                (
                    [0] => Рћ компании
                )

            [link] => SimpleXMLElement Object
                (
                    [0] => #
                )

            [id] => SimpleXMLElement Object
                (
                    [0] => 0
                )

        )

    [1] => Array
        (
            [title] => SimpleXMLElement Object
                (
                    [0] => Р•ще что-то
                )

            [link] => SimpleXMLElement Object
                (
                    [0] => #
                )

            [id] => SimpleXMLElement Object
                (
                    [0] => 1
                )

        )

)


Получается такой массив. Но как именно получить доступ к содержимому атрибута, а не к объекту?

Автор: icewind 6.8.2009, 14:22
Пара примеров по получению атрибутов. ( в файле test.xml лежит исходный xml документ )

Код

$xml = simplexml_load_file('test.xml');

foreach( $xml->cat[0]->attributes() as $name => $val )
{
   echo "Attribute " . $name . " = " . $val . "<br />";
}

$title = (string)$xml->cat[0]->attributes()->title;

echo $title;
 

Для того чтоб получить не экземпляр класса SimpleXMLObject, а значение, нужно привести его к строке выполнив конкатенацию или указав тип явно.

Автор: SneG0K 6.8.2009, 23:04
А можно ли как-нить использовать кодировку windows-1251 и русские символы в XML файле? А то у меня такая путаница с кодировками теперь.

Автор: icewind 6.8.2009, 23:59
Сохранить xml можно в windows-1251 и указать кодировку
Код

<?xml version="1.0" encoding="windows-1251"?>

но после парсинга SimpleXML все равно вернет данные в кодировке utf-8

Автор: SneG0K 7.8.2009, 00:51
Тоесть мне в любом случае нужно будет отослать хидер с кодировкой utf-8?

Автор: icewind 7.8.2009, 10:51
Ну тут либо отдавать реальный утф вместе с хидером, либо уже все делать в windows-1251
Код

$title = iconv("UTF-8", "windows-1251", (string)$xml->cat[0]->attributes()->title);

Автор: SneG0K 7.8.2009, 10:55
icewind, да нет, это довольно муторный вариант, лучше уж буду тогда разруливать все в utf-8

Автор: bars80080 7.8.2009, 13:40
а как по массиву видно какие имена тэгов?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)