Парсинг xml с выгрузкой в БД. Часть 2.

Опубликовано Опубликовано в рубрике PHP, SQL, XML

Итак, в прошлой заметке мы рассмотрели парсинг xml документа с заданной структурой и даже разложили его по уровням вложенности тэгов. Однако кому будет интересен простой древовидный вывод документа на странице? Ведь xml — это структурированный набор данных, а значит вывод напрашивается сам собой! Можно перенести структуру в базу данных.

Будем считать, что структура в базе данных создаётся нами вручную. Создание таблиц в соответствии со структурой в xml — отдельная задача. Пока нас интересует непосредственно корректная запись в базу.

Поскольку мы создаём базу вручную, что для удобства назовём колонки таблицы так, как называются «несущие» тэги, т.е. тэги, содержащие внутри себя информацию.

Создание такой базы не займёт много времени при использовании интерфейса СУБД MySQL PHPMyAdmin. Особо кропотливым никто не запрещает создать базу «вручную»! =)

Теперь необходимо обработать «распарсенный» вывод документа.

Замечаем, что при парсинге из первой части статьи используется переменная $name для вывода имени тэга и переменная $str для вывода значения содержимого. Их мы и будем использовать в нашей работе.

За primary key примем значение id. Пускай оно пишется во все наши таблицы. В примере я буду работать с одной таблицей.

Для начала нам понадобятся глобальные переменные

global $name1;
global $parent;

Первая — это глобальный аналог переменной $name. Тут же присвоим им равенство. Вторая — это переменная, которая будет помогать нам организовывать наследование в xml. Зачем оно надо? Не все xml-ки приходят в удобоваримом формате, и в них могут встречаться теги с одинаковым именем, но в различных уровнях вложенности. Потому надо как-то надо их идентифицировать. А это очень удобно делать, зная родителя текущего элемента.

На входе проверяем имя элемента. Если это id, то создаём новую запись. Иначе мы её просто обновляем.

if ($name1 == 'id')
		{
			global $filtr;
			$filtr = $elm; //задали фильтр для последующих апдейтов. чтобы дописывала данные в строки с нужным айдишником
			$user="devenergru_help";
			$password="test_pars";
			$database="devenergru_help";
			if ($db=@mysql_connect("localhost",$user,$password))
				{
					mysql_select_db($database);	
					echo "База данных найдена!";
					//кладём id во все таблицы
					$sql = "INSERT INTO `summary` (`$name1`) VALUES ($elm)";
					//echo $sql;
					mysql_query($sql) or die(mysql_error());
				}
		}

Теперь пишем в другие ячейки таблицы в соответствии с именами. Вы спросите, почему бы не писать сразу? Это сделано заранее для различных таблиц БД. Не стоит забывать про нормирование БД!

Заметим, что появилась ещё одна глобальная переменная, помогающая корректно писать переменные в базу данных (к правильному id).

else
			{
				global $filtr;
				$user="devenergru_help";
				$password="test_pars";
				$database="devenergru_help";
				if ($db=@mysql_connect("localhost",$user,$password))
					{
						mysql_select_db($database);	
						echo "База данных найдена!";
						//кладём id во все таблицы
						$sql = "UPDATE `summary` SET `$name1`='$elm' WHERE `id` = ('$filtr')";
						//echo $sql;
						mysql_query($sql) or die(mysql_error());
					}
			}

Замечание! По-хорошему, надо вынести подключение к Базе Данных за условный код.

После этих несложных итераций можно увидеть содержимое уже внутри базы.

Замечание 2. Немного о наследовании.

Организовать его в построчной обработке — нетривиальная задача. Я придумал следующий алгоритм. В цикле при парсинге мы выделяем теги высоких уровней и пишем их в глобальную переменную $parent. Соответственно, при вхождении искомого трассирующего тега переменная меняется. Обязательно нужно очистить переменную при выходе из цикла, чтобы она не присвоилась каким-то элементам-родителям.

В третьей части статьи речь пойдёт о том, как организовать вывод полученных данных обратно из БД с блэкджеком и фильтрами! =)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *