Генерация XML файла средствами PHP

Добрый вечер! Сегодня я расскажу, как генерировать XML файл с данными с помощью PHP на примере специального  xml-файла в формате YMapsML. YMapsML – это формат файла с географическими данными, используюемый API Яндекс.Карт. В виде такого файла очень удобно передавать данные в Яндекс Карты, а если данные зависят от какого-либо параметра, то генерация такого файла с нужным набором данных Вам просто необходима.

Итак, рассмотрим нашу задачу более подробно.

Дано: mysql база, где в таблице содержаться данные для каждой метки (например, погода в различных городах по регионам) в виде: её названия, географических координат и описания метки.

Задача: создать YMapsML-файл с данными из базы, который затем можно напрямую подгружать в яндекс карты.

Ну что, приступим к решению! Однако, я сразу оговорюсь, что в данной статье я не буду подробно рассматривать задачу вывода данных из базы.

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

<?php header("Content-Type:text/xml");
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
?>

Первой строкой мы указываем заголовок файла – теперь браузер будет знать, что это xml-файл. Вторая строка – это стандартный заголовок всех xml файлов, однако мы выводим его через PHP, т.к. если попытаться вывести его как простой код, то сервер выдаст ошибку из-за символов “<?” и “?>”. Вот так!

Далее будет содержаться весь xml код нашего файла. Рассматриваемый в данной статье YMapsML файл в общем виде выглядит так.

<ymaps:ymaps xmlns:ymaps="http://maps.yandex.ru/ymaps/1.x"
       xmlns:repr="http://maps.yandex.ru/representation/1.x"
       xmlns:gml="http://www.opengis.net/gml"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maps.yandex.ru/schemas/ymaps/1.x/ymaps.xsd">
<ymaps:GeoObjectCollection>
    <gml:featureMembers>
    	<ymaps:GeoObjectCollection>
        	<gml:name>Название коллекции</gml:name>
        	<gml:featureMembers>
                   <ymaps:GeoObject>
                      <gml:name>Название метки</gml:name>
                      <gml:description>Описание метки</gml:description>
                      <gml:Point>
                          <gml:pos>Координаты метки</gml:pos>
                      </gml:Point>
                  </ymaps:GeoObject>
              </gml:featureMembers>
          </ymaps:GeoObjectCollection>
    </gml:featureMembers>
</ymaps:GeoObjectCollection>
</ymaps:ymaps>

Как Вы видите, структура достаточно проста, однако некоторые моменты я поясню. Для вывода меток на карту, в любом количестве, необходимо их объединить в коллекцию, которая находиться внутри тэга <GeoObjectCollection>. Если таких коллекций должно быть несколько, в нашем случае у нас коллекция меток по городам, объединённых по областям, то все коллекции располагаются “одна за другой”, а затем они заключаются в общую коллекцию. Данный трюк вы можете наблюдать в приведённом выше коде, однако в нём мы используем одну коллекцию, поэтому такое вложение бессмысленно, хотя и не является ошибкой. Такой код всё равно будет работать!

Теперь Вам, надеюсь, тоже стало очевидно, что для вывода множества меток из базы нам необходимо будет использовать в цикле конструкцию

<ymaps:GeoObject>
	<gml:name>Название метки</gml:name>
	<gml:description>Описание метки</gml:description>
	<gml:Point>
		<gml:pos>Координаты метки</gml:pos>
	</gml:Point>
</ymaps:GeoObject>

Используя эту конструкцию внутри цикла, мы выводим поочерёдно все необходимые нам строки и получаем готовый xml-файл формата YMapsML, готовый для прямого его использования яндекс картами.

На этом всё! Мой опыт общения с API Яндекс.Карт продолжается, поэтому в будущем будут ещё статьи по этой теме. Если Вам что-то осталось непонятным или у Вас появились какие-либо вопросы, то смело задавайте их в комментариях к данному посту – я обязательно вам расскажу об этом поподробнее, возможно даже в виде нового поста.

До встречи!