22 июня 2011

Экспорт из MySql в XML.


Понадобилось тут мне для одного проекта получить список стран и их кодов (ISO-3166) в XML. У меня уже была база данных MySql, содержащая эти данные на нескольких языках. Сначала была мысль сделать XML вручную, ибо строк в каждой таблице было около 200. Посему просто сделал запрос в поисковике: "XML редактор". На первой же странице  увидел редактор от Microsoft под названием "XML Notepad 2007". Скачал, поизучал. Штука оказалась потрясающе удобная. Останавливала только лень создавать около 400 узлов вручную
, и вероятность ошибки, которую легко допустить при составлении документа.

 Имелась возможность экспорта таблицы из PhpMyAdmin, но данный экспорт не совсем годился для моей задачи и полученный XML пришлось бы нормализовать вручную. Решение пришло довольно быстро. Примерно 40 строк кода на Php, и готовый XML был уже в работе.



<?php
header("Content-Type: text/html; charset=UTF-8");
// header нужен для того, чтобы сообщить браузеру
// о используемой кодировке
//
// Здесь задаем параметры подключения к базе данных MySql
$dbhost = 'хост базы данных';
$dbuser = 'пользователь';
$dbpass = 'пароль';
$dbname = 'название базы данных';

// Начинаем формировать XML, который будет хранится в переменной $result
$result='<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<countries>
    <english>
';
        // Подключаемся к базе данных
        $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
        mysql_select_db($dbname);
        // Сообщаем MySql о кодировке
        mysql_query("SET NAMES utf8;");
        // Составляем запрос по выбору кода и названия страны из таблицы
        $query = mysql_query("SELECT code, country FROM `worldip_land_en` ORDER BY country"); 
        if ($query) {
            // Затем в цикле разбираем запрос, и формируем XML
            while ($row = mysql_fetch_array($query)) { 
                $result.='  <country name="'.$row['country'].'">
                <code>'.$row['code'].'</code>
            </country>
            ';
        }
    } 
    // Закрываем ноду "english" и открываем ноду "russian"
    $result.=' </english>
    <russian>
';
        // Теперь все тоже, что и выше, только для таблицы, содержащей русские названия
        $query = mysql_query("SELECT code, country FROM `worldip_land_ru` ORDER BY country"); 
        if ($query) {
            while ($row = mysql_fetch_array($query)) { 
                $result.='  <country name="'.$row['country'].'">
                <code>'.$row['code'].'</code>
            </country>
            ';
        }
    } 

    $result.=' </russian>
</countries>';
// Выводим результат на экран
echo $result;
?>


И все!!! От постановки задачи до реализации ушло около 15 минут. При том, что была исключена ручная работа и вероятность ошибки при составлении, была сэкономлена куча времени.
Пользуйтесь своими знаниями,
ваш В.А

2 комментария:

  1. Код размещен плохо читаемым!

    ОтветитьУдалить
    Ответы
    1. Здравствуй, дорогой анонимус. На момент публикации, а это было два года назад, всё было читаемым, с тех пор многое поменялось внутри этой блогоплатформы. Потому в шапке есть надпись «Блог переехал на asakasinsky.ru». Я попробовал на скорую руку поставить подсветку синтаксиса, так не совсем удалось, что подтвержает правильность переезда. Так что не обессудь.

      Удалить