Перейти к содержимому


Выгрузка XML

XML Выгрузка

Сообщений в теме: 15

#1 ManFree

    Активный участник

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 08 Июнь 2014 - 08:59

Для обмена с сторонними ресурсами и автоматизации размещения информации на них мне необходимо на основе данных в БД создавать XML файл с определенной структурой. Хочу чтоб это делалось раз в день к примеру по крон.
Подскажите с чего начать и какие команды использовать для создания такого файла

#2 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 08 Июнь 2014 - 13:58

Просмотр сообщенияManFree (08 Июнь 2014 - 08:59) писал:

Для обмена с сторонними ресурсами и автоматизации размещения информации на них мне необходимо на основе данных в БД создавать XML файл с определенной структурой. Хочу чтоб это делалось раз в день к примеру по крон.
Подскажите с чего начать и какие команды использовать для создания такого файла

<?php
function fetch2xml($sql) {
	$q = mysql_query($sql);
	$doc = new DOMDocument('1.0', 'UTF-8');
	$root = $doc->appendChild($doc->createElement('result'));
	while ($qrow = mysql_fetch_assoc($q)) {
		$r = $root->appendChild($doc->createElement('r'));
		foreach($qrow as $name => $value) {
			// Не включаем поля со значением NULL
			if ($value !== NULL) {
				$f = $r->appendChild($doc->createElement($name));
				$f->appendChild($doc->createTextNode($value));
			}
		}
	}
	return $doc;
}
mysql_connect(...);
mysql_select_db(...);
$doc = fetch2xml(...);
header("Content-Type: text/xml; charset=UTF-8");
echo $doc->saveXML();
?>

Сообщение отредактировал maksn: 08 Июнь 2014 - 13:59

"...Сижу, паяю. CRM починяю..."
Мои разработки

#3 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 08 Июнь 2014 - 16:15

В рамках кб, я бы советовал, исключать вcе функции mysql_ и использовать аналоги sql_

#4 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 08 Июнь 2014 - 16:35

Просмотр сообщенияwondertalik (08 Июнь 2014 - 16:15) писал:

В рамках кб, я бы советовал, исключать вcе функции mysql_ и использовать аналоги sql_

Этот пример был дан для общего понимания задачи, а не для слепого копирования

Сообщение отредактировал maksn: 08 Июнь 2014 - 16:37

"...Сижу, паяю. CRM починяю..."
Мои разработки

#5 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 08 Июнь 2014 - 17:10

Просмотр сообщенияmaksn (08 Июнь 2014 - 16:35) писал:

Этот пример был дан для общего понимания задачи, а не для слепого копирования
Именно поэтому лучше сразу указывать более корректный пример. Так как в отличии, от Вас, ManFree не владеет настолько глубоко вопросом.

#6 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 08 Июнь 2014 - 23:16

Просмотр сообщенияwondertalik (08 Июнь 2014 - 17:10) писал:

Именно поэтому лучше сразу указывать более корректный пример. Так как в отличии, от Вас, ManFree не владеет настолько глубоко вопросом.

wondertalik Не хочу быть не вежливым. Но откуда Вы знаете уровень не знакомого Вам человека? Если он просит подсказать направление, а не готовое решение его проблемы, то я вправе рассчитывать на достаточный уровень понимания

Special thanks for

Цитата

указывать более корректный пример

It's so cool and wonder!
I am shocked and lay down :(

Сообщение отредактировал maksn: 09 Июнь 2014 - 01:05

"...Сижу, паяю. CRM починяю..."
Мои разработки

#7 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 09 Июнь 2014 - 01:22

Просмотр сообщенияmaksn (08 Июнь 2014 - 23:16) писал:

wondertalik Не хочу быть не вежливым. Но откуда Вы знаете уровень не знакомого Вам человека? Если он просит подсказать направление, а не готовое решение его проблемы, то я вправе рассчитывать на достаточный уровень понимания
Это не совет, не упрек, и Боже упаси, не клевета на уровень кого-либо на форуме, а личный опыт потерянного не малого количества времени. Я на mysql_ функциях в некоторых проектах в кб потерял достаточно времени, чтобы выяснить почему оно не работает. Иногда писал в кб, чтобы исправили. Иногда по волшебным для меня причинам с функциями mysql_ просто не работало (особенно это сказывалось при обновлении от одной версии к другой). Поэтому, я всего лишь делюсь своим, полученным эмпирическим путем, опытом и не более.

#8 ManFree

    Активный участник

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 09 Июнь 2014 - 17:01

Всем привет. Знания мои на уровне гугле поиска если несложно дайте несколько комментов к вышеизложенному тексту

Начало понятно, передали функции строку с SQL-запросом, результат запихнули в переменную и создали новый объект


$root = $doc->appendChild($doc->createElement('result'));

Здесь у меня начинаются потемки
Создали элемент DOM на основе результ добавили в конец чего-то и все запихнули в рут

в общем не понимаю строчку


while ($qrow = mysql_fetch_assoc($q)) {
				$r = $root->appendChild($doc->createElement('r'));
цикл вайл понятно дальше что делаем с элементами ?

foreach($qrow as $name => $value) {
						// Не включаем поля со значением NULL
						if ($value !== NULL) {
								$f = $r->appendChild($doc->createElement($name));
								$f->appendChild($doc->createTextNode($value));

тут понятно перебираем Qrow
цикл будет дополнительно соотносить ключ текущего элемента с переменной $name на каждой итерации.
В моем случае $name я где беру?
ну и последние две строчки не понятны потому как не понимаю где я использую $f чтоб в итоге получить $doc


ну и напоследок
mysql_connect(...);
mysql_select_db(...);
$doc = fetch2xml(...);
header("Content-Type: text/xml; charset=UTF-8");
echo $doc->saveXML();
?>


зачем мы конектимся в базу, разве мы еще неприконечены?
Не проще записать функцию в файлик и и вызывать инклудом

тогда $doc = fetch2xml(...); где вместо точек пологаю sql запрос.


ну и saveXML понятно

Сообщение отредактировал ManFree: 09 Июнь 2014 - 17:19


#9 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 09 Июнь 2014 - 22:34

Хм... Похоже я ошибся в своих предположениях.

Объяснять долго
Если не понятно, то просто возьмите функцию
function fetch2xml($sql) {
		$q = sql_query($sql);
		$doc = new DOMDocument('1.0', 'UTF-8');
		$root = $doc->appendChild($doc->createElement('result'));
		while ($qrow = sql_fetch_assoc($q)) {
				$r = $root->appendChild($doc->createElement('r'));
				foreach($qrow as $name => $value) {
						// Не включаем поля со значением NULL
						if ($value !== NULL) {
								$f = $r->appendChild($doc->createElement($name));
								$f->appendChild($doc->createTextNode($value));
						}
				}
		}
		return $doc;
}

Эта функция создаст XML со структурой, соответствующей вашему запросу, где будут перечислены имена полей с их значениями.

Цитата

В моем случае $name я где беру?

$name "брать" нигде не нужно. Это имя поля таблицы - ключи массива $qrow, полученного с помощью
while ($qrow = sql_fetch_assoc($q))

foreach($qrow as $name => $value)
Стандартный перебор элементов массива $qrow (записи/строки, возвращаемой запросом).

Цитата

зачем мы конектимся в базу, разве мы еще неприконечены?
Не проще записать функцию в файлик и и вызывать инклудом

тогда $doc = fetch2xml(...); где вместо точек пологаю sql запрос.


ну и saveXML понятно

Пример был дан как общий случай.
Для КБ действительно не нужно mysql_connect(...); и mysql_select_db(...);

Достаточно вызова функции в нужном Вам месте
$doc = fetch2xml(Текст запроса);

Последние две строчки нужны для вывода полученного XML.
header("Content-Type: text/xml; charset=UTF-8");
echo $doc->saveXML();
Да, и специально для Вас, я убрал mysql_ функции, заменив их на аналоги (sql_) в КБ
Special thank's to Wondertalik :)
Вот пример полученного XML
<result>
 <r>
  <cnt_in>2</cnt_in>
  <cnt_out>1</cnt_out>
  <rest>1</rest>
  <cnt_rsvd>1</cnt_rsvd>
  <id>8</id>
  <model>Boxer 10 kVA</model>
  <ed_izm_id>1</ed_izm_id>
  <ed_izm>шт.</ed_izm>
  <price>0.00</price>
  <brand>Makelsan</brand>
  <brand_id>4</brand_id>
  <p_group>ИБП</p_group>
 </r>
 <r>
  <cnt_in>5</cnt_in>
  <cnt_out>1</cnt_out>
  <rest>4</rest>
  <cnt_rsvd>1</cnt_rsvd>
  <id>10</id>
  <model>Boxer 20 kVA</model>
  <ed_izm_id>1</ed_izm_id>
  <ed_izm>шт.</ed_izm>
  <price>0.00</price>
  <brand>Makelsan</brand>
  <brand_id>4</brand_id>
  <p_group>ИБП</p_group>
 </r>
</result>

Сообщение отредактировал maksn: 09 Июнь 2014 - 23:17

"...Сижу, паяю. CRM починяю..."
Мои разработки

#10 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 10 Июнь 2014 - 00:47

Добавлю.

Если нужно скачать полученный результат, то
 header("Content-Type: text/xml; charset=UTF-8");
 header("Content-Disposition: attachment; filename=".$name); 
 echo $doc->saveXML();

"...Сижу, паяю. CRM починяю..."
Мои разработки

#11 ManFree

    Активный участник

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 10 Июнь 2014 - 07:24

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

#12 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 10 Июнь 2014 - 09:22

Просмотр сообщенияManFree (10 Июнь 2014 - 07:24) писал:

После я так понимаю можно с файликом поработать и переименовать названия полей, так как они могут не соответствовать шаблону поставщика услуг.
Остался один ньюанс, когда мне нужно вывести не все поля таблицы.. но это ладно после экспериментов) если не получится чего-нить
Огромное спасибо за помощь, будем кулибничать)
Да не нужно с "с файликом поработать". Просто сделайте тот запрос, что нужен.
Например
$sql = "SELECT * FROM `".DATA_TABLE."42` WHERE `status`=0";
$doc = fetch2xml($sql);

И Вы получите XML в котором будут все "активные" записи со всеми полями из таблицы Контрагенты с их значениями
Нужны другие данные? Формируйте текст запроса и подставляйте в функцию. Названия полей можете задавать самостоятельно
SELECT `f123` as need_name FROM `НУЖНАЯ ТАБЛИЦА` WHERE 'НУЖНОЕ УСЛОВИЕ ОТБОРА ЗАПИСЕЙ'
f123 - имя нужного Вам поля.
as need_name - то имя поля, под которым Вы хотите его видеть, в том числе и в XML

Сообщение отредактировал maksn: 10 Июнь 2014 - 10:08

"...Сижу, паяю. CRM починяю..."
Мои разработки

#13 ManFree

    Активный участник

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 16 Июнь 2014 - 10:35

Все врубился. Спасибо за разжовывания )

#14 ManFree

    Активный участник

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 30 Июнь 2014 - 11:34

Есть еще вопросик.
При выгрузке по правилам обмена есть поля которые у меня в базе не числятся так как всегда одинаковыеа для выгрузки они нужны. Можно как то их добавить запросом не добавляя в базу данных, или это надо править сам feth2xml

#15 ManFree

    Активный участник

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 03 Август 2014 - 19:36

несмелый апчик. начал добавлять поля ((( в базу есть может другой варик ?

#16 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 08 Август 2014 - 14:43

Просмотр сообщенияManFree (30 Июнь 2014 - 11:34) писал:

Есть еще вопросик.
При выгрузке по правилам обмена есть поля которые у меня в базе не числятся так как всегда одинаковыеа для выгрузки они нужны. Можно как то их добавить запросом не добавляя в базу данных, или это надо править сам feth2xml

Нужно показать в XML не существующие в базе данные?
Тогда
SELECT 0 as num, 'ТЕСТ' as test, `f123` as need_name FROM `НУЖНАЯ ТАБЛИЦА` WHERE 'НУЖНОЕ УСЛОВИЕ ОТБОРА ЗАПИСЕЙ'
Можете вставлять свои "не числящиеся в базе" поля и давать им собственное имя.
0 и ТЕСТ будут присутствовать в каждой записи
"...Сижу, паяю. CRM починяю..."
Мои разработки





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных