Экспорт из MySQL в XML

Статус
В этой теме нельзя размещать новые ответы.

Despod

Новичок
Экспорт из MySQL в XML

Подскажите пожалуйсто. У меня есть база Ф.И.О адресов и телефонов. Нужно сделать экспорт дружественным сайтам этой информации. Один знакомый сказал что нужно генерить XML и выводить его в браузер. (Что такое XML смутно представляю).
Чел выбирает предположим один из отделов, предположим по сылке скрипт.php?otdel=1 должен получить на экране ХML-ку.
как это сделать незнаю. Подскажите плиз.

Почитал доки, сказано что мол использовать DOM.
С первой же строки облом.
<?php
domxml_new_xmldoc("1.0");
?>
пишет:
Call to undefined function domxml_new_xmldoc()
Как это устранить не могу понять. Если кто подскажет буду благодарен.
Решил использовать тупой метод. Создавать файл.xml fwrite-ом писать туда информацию, а потом делать на него редирект. Тоже облом вышел. Русские буквы вылезают абракодаброй.
нашел функцию если не ошибаюсь utf8_encoding, но она меня тоже не спасла.

Подскажите что делать? И желательно на примере(рабочем).
 

Фанат

oncle terrible
Команда форума
XML ничем принципиально не отличается от html
если ты умеешь генерить html, то умеешь и XML

"абракадабра" получается по тем же самым причинам, что и в html - если указана кодировка, отличающаяся от реальной.
 

voituk

прозревший
Header("Content-type: application/xml; charset=cp1251");
echo '<?xml version="1.0" encoding="cp1251" ?>';
echo '<pim>';
echo '<person>';
//тут дальше пиши свой экспорт
echo '</person>';
echo '</pim>';

И не нужен тебе никакой dom xml.
Он тебе понадобится если ты начнешь выполнять разбор xml, да и тогда можно будет использовать PEAR::XML_Tree
 

Despod

Новичок
А в чем ошибка не подскажете на будущее?Call to undefined function domxml_new_xmldoc()

И еще. Может как то експорт другим способом делать, не только через xml?
 

Фанат

oncle terrible
Команда форума
попробуй перевести это сообщение с английского.
 

dimgel

Новичок
Despod
Ошибка скорее всего по одной из причин:
1) у тебя PHP5, используй модуль DOM (new DOMDocument()).
2) у тебя PHP4, но модуль DOM XML не подключен.

Votik
PHP:
echo '<?xml version="1.0" encoding="cp1251" ?>';
echo '<pim>';
...
За такие советы пороть надо.

Despod
Вот пример кода, который делает преобразование результата любого SQL SELECT в XML (PHP5, выдран из моих наработок и упрощен, работоспособность не проверял):

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();

Автор оригинала: Despod
И еще. Может как то експорт другим способом делать, не только через xml?
Привыкай. :) На самом деле XML - очень удобная штука. И в твоей задаче (обмен данными между предприятиями) является стандартом де-факто.

-~{}~ 03.04.06 14:56:

И кстати, обязательно прочитай статьи Дмитрия Лебедева на этом портале, в разделе XML.
 

voituk

прозревший
dimgel
Это почему же пороть?
Ты хочешь сказать что создание XML-экспорта лучше делать с помощью DOM?
А хочу поглядеть на твоё DOM-дерево при размере экспорта в несколько десятков мегабайт! У меня php в coredump выпадает при unlimited memory usage.
Зачем зря нагружать сервер?
 

dimgel

Новичок
voituk
Пишу скорее для Despod. При выводе вручную, необходимо вручную экранировать <, >, &. А если ещё документ мультиязыковой в UTF-8, то я вообще не уверен, что его можно вручную корректно вывести (собственно, меня эта проблема и не интересует).

А про необходимость выводить несколько десятков мегабайт в один XML я в первый раз слышу. Зачем, если не секрет? Скорее всего, это пример использования XML там, где он на фиг не нужен, как например при дампе базы.

-~{}~ 03.04.06 15:38:

Собственно, XML тем и хорош, что позволяет генерировать валидный структурированный документ с помощью DOM, не заботясь о правильном форматировании (и даже ничего о нем не зная). А если убрать DOM и всё делать ручками как в добрые старые времена, то гораздо эффективнее и проще использовать обычный CSV. А в плане производительности XML всегда будет проигрывать перед CSV - это плата за удобство и гибкость.
 

voituk

прозревший
dimgel
Первый тезис про кодировки и экранирование - полный бред.
Экранировать нужно не только в xml но ещё и в sql, пользовательстий ввод и ещё много разных данных. Ничего страшного в этом нету.
Я обычно пишу функция какая все это выполняет со всем значениями узлов и параметров.

Про десятки мегабайт - смешно - но могу сказать одно - это ещё типичные задачи. В нетипичных задачах размер экспорта доходит до 200 метров. :)

И причем тут "XML там, где он на фиг не нужен"?
Если данных много - это значит что xml тут не применим? Ерунда!
Каким может быть экспорт базы данных размером в 14-15ГБ? На фоне этого 20 мегабайт - капля в море.

-~{}~ 03.04.06 14:51:

dimgel
Не стоит сравнивать xml и csv.
xml (цитируя тебя же) "структурированный документ"
csv - плоские таблицы
 

dimgel

Новичок
voituk
Ты не ответил, для каких задач ты используешь такие объемные XML. Возможно, в твоём случае оно действительно оправдано (хотя я очень сильно в этом сомневаюсь).

Впрочем, разговор уезжает не в ту плоскость. Я изначально говорил про то, что твой исходный совет - это приучение человека к дурному стилю. Если ты его дурным не считаешь, то вряд ли я смогу тебя переубедить. Флеймить не хочу, поэтому с базара съезжаю.
 

ivankrkrkr

Новичок
Пишу скорее для voituk
1. Про экранирование - не бред. Вот смотри, предположим у тебя есть строка следующего вида "< &lt; &#38;#60;" На вид немного абсурдная строка, но мы ведь не знаем что за данные предаются, может быть и такое, причем эти вот букавки могут идти не подряд, а просто встречаться в содержимом документа в разных местах. Скажи пожалуйста как ты бработаешь каждую из подстрок, используя свой "ручной метод"? Ты ведь наверное собираешься заменить только ">", а остальное все оставить? Если "да" - то ты неправильно решил задачу.
2. Шмат базы данных в XML размером в 200 Мб (даже в 20) я б передавать не стал, использовал бы что нибудь другое. Хотя бы потому, что на принимающей стороне тот же самый здоровый файл кто-то должен открыть при помощи DOM (может быть более быстрым и тупым SAX). Или на другом конце провода сидит такой же интузиаст и парсит ИЕРАРХИЧЕСКИЙ документ (то есть, в общем случае, со вложенными элементами) тоже при помощи строковых функций?

Если данных много - это значит что xml тут не применим? Ерунда!
Скорее всего ты действительно его не там применяешь. "Ерундой" я б назвал разбор XML-документа "вручную", то есть без DOM, SAX...

-~{}~ 03.04.06 16:16:

причем эти вот букавки могут идти не подряд
Я ошибся, нужно было написать "причем эти вот ПОДСТРОКИ могут идти не подряд".

Если это флейм - прошу прощения и замолкаю.
 

voituk

прозревший
dimgel
Конкретный пример - экспортировать в аналитический отдел телекомуникационной компании отчеты по использованию её абонетами сервиса, предоставляемого нами.
Данные обновляются раз в 3 часа.
При использовании DOM XML упирались в codedumped.

Твой "правильный стиль" - теория, а практике же регулярно от него отходить из-за неимоверных нагрузок.
Я аргументировано обьясняю?

-~{}~ 03.04.06 17:35:

ivankrkrkr
ВЫ ЧЕ ИЗДЕВАЕТЕСЬ?
Где я писал про РАЗБОР xml без DOM и SAX?

Если ты не в состоянии написать функцию какая будет кодировать строку как значение xml-узла - читайте книги!
А если книги (как и мои посты) читать не сложилось - возьми готовую функцию, например из класса PEAR::XML_Tree.

А применяю XML я только там где ставят такие требования, поскольку в условиях высоких нагрузок использовать xml - непозволительная роскошь (даже несмотря на низкую стоимость железа).

Про разбор xml-данных по 20 метров разговор отдельный - но в данном случае sax работает довольно таки быстро.

dimgel, ivankrkrkr - предлагаю закрыть дискуссия и оставить свое мнение при себе, но и учесть опыт реальных проектов, а не только теоретическо-идейных проектиков с генерацией xml на 100-200 кб с помощью DOM.


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

slach

Новичок
=)
нормальная дискуссия получилась =)
тему закрываю, а то вы не дай бог еще переругаетесь
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху