MySQL "научили" отдавать XML

HabaHaba

Новичок
MySQL "научили" отдавать XML

Для тех кто не знает, в четвертой версии MySQL-я теперь поддерживается возвращение запросов в XML формате.
По поводу хорошо-не-хорошо ещё пока ничего сказать не могу, так как только нашел эту фичу.
Для того, что бы сервер вернул результат запроса в XML формате, необходимо запустить его с ключем "-X".
Пример того, что отдает:
<?xml version="1.0"?>
<resultset statement="SELECT name as product_name, product_id, product_type_id FROM product LIMIT 2">
<row>
<product_name>Трекбол Logitech TrackMan Marble FX</product_name>
<product_id>1</product_id>
<product_type_id>0</product_type_id>
</row>

<row>
<product_name>Microsoft Encarta World Dictionary 1.0 Win32 Eng CD</product_name>
<product_id>2</product_id>
<product_type_id>0</product_type_id>
</row>
</resultset>
 

slach

Новичок
ухты

вот нифига себе =))
срочна нада скачать MySQL
а то что то я со своими ASP'шными проэктами савсем от любимых игрушек отошел =))

фигово то, что как я понял если пускать mysqld.exe
с ключем -X то он начинает отдавать ВСЕ запросы в таком виде...

а КАК тогда их парсить через mysql_query()+mysql_fetch_array() ???
приведите кусок кода ! плиииз =)
===============
по поводу приведенного результата запроса...
в принципе, нормально вполне, с таким XML можно работать...
причем на уровне XSLT с ним можно будет работать довольно быстро...

разработчики MySQL пошли как обычно наиболее простым путем =)

у Мракософта например результат преобразования рекордсета в XML выглядит примерно так:
=================
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
<s:AttributeType name='F_CAS' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='32'/>
</s:AttributeType>
<s:AttributeType name='F_CAS_Name' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='536870910' rs:long='true'/>
</s:AttributeType>
<s:AttributeType name='F_CAS_tid' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row F_CAS='0000001' F_CAS_Name='Acrylonitrile, Inhibited' F_CAS_tid='30'/>
<z:row F_CAS='0000006' F_CAS_Name='AEROSOLВ® OT-75% Surfactant' F_CAS_tid='31'/>
<z:row F_CAS='0000007' F_CAS_Name='AEROSOLВ® OT 100% Surfactant' F_CAS_tid='32'/>
</rs:data>
</xml>

=================

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

так что вот =)

но за новость все равно спасибо =)
будут еще успехи в этом направлении, пишите в форум... обязательно
 

HabaHaba

Новичок
Re: ухты

Автор оригинала: slach
фигово то, что как я понял если пускать mysqld.exe
с ключем -X то он начинает отдавать ВСЕ запросы в таком виде...
Опс... Моя лажа. Вообще, имелся ввиду запуск именно mysql с ключиком -X (или --xml).

Автор оригинала: slach
а КАК тогда их парсить через mysql_query()+mysql_fetch_array() ???
приведите кусок кода ! плиииз =)
Вот с этим я тоже пока не разобрался... Пытаюсь сейчас выудить можно ли каким-нибудь образом в mysql_connect задавать параметры коннекта.
 

Alexandre

PHPПенсионер
как видите, на лицо некоторая избыточность данных... но с другой стороны ... у нас были случаи когда она оказывалась полезной =)
тут типа и схема для валидации есть...
и в общем то этот XML потом обратно в рекордсет преобразовать можно...
У Майкрософта есть утилитка SQLXML, которая позволяет задать xsd файл и генерит любые XML выходные данные.

Но как показывает практика, проще написать свою dll,
которрая будет генерить свои XML выходные данные на основе таблиц.

Думаю так надо поступить и с MySQL используя XML DOM (libxml.dll) лично я так и делаю при выводе прайсов )...
 

HabaHaba

Новичок
Автор оригинала: Alexandre
Думаю так надо поступить и с MySQL используя XML DOM (libxml.dll) лично я так и делаю при выводе прайсов )...
Александре, не поделитесь ли опытом?
Очень интересует вопрос о том, возможно ли генерить сложные XML документы?
Тоесть, не одноступенчатые:

<recordset>
<row></row>
......................
</recordset>

А что нибудь вроде:

<model id='1' lang='ru'>
<name name='Название'>Samsung 7763EN</name>
<images>
<image src="host/image.jpg" width="320" height="200">
<image src="host/image2.jpg" width="640" height="480">
</images>
</model>
 

Alexandre

PHPПенсионер
я не совсем понял вопроса,
если надо создать "сложные" документы, типа ....

то вот код

<?php
/*
<model id='1' lang='ru'>
<name name='Название'>Samsung 7763EN</name>
<images>
<image src="host/image.jpg" width="320" height="200">
<image src="host/image2.jpg" width="640" height="480">
</images>
</model>
*/


//$dom = new_xmldoc("1.0" );
$dom = xmldoc("<model/>" );

$root= $dom->root();
$model = $root;
domxml_set_attribute($model,'id','1');
domxml_set_attribute($model,'lang','ru');

$name = $root->new_child("name",'Samsung 7763EN');
domxml_set_attribute($name,'name','Nazvanie');

$imgs = $root->new_child("images",'');
$img = $imgs->new_child("image",'');
domxml_set_attribute($img,'src','host/image.jpg');
domxml_set_attribute($img,'width','230');
domxml_set_attribute($img,'height','200');


$img = $imgs->new_child("image",'');
domxml_set_attribute($img,'src','host/image2.jpg');
domxml_set_attribute($img,'width','640');
domxml_set_attribute($img,'height','480');

//$model = $dom->add_root("model");
echo domxml_dumpmem($dom);

?>

если необходимо создать сложные до-ты, используя данные из таблиц, то это тоже очень просто
Пример -- имеем две таблицы

1. Разделы Прайса
2. Прайс

Пусть Необходимо создать документ

<Price>
<Section id=1 Name="Электротовары">
<subSection id=1 Name ="Чайники" >
<item articul=123 NAme="Чайник Филипс" price=10 Currency = "USD">
<item articul=123 NAme="Чайник PHP" price=1026 Currency = "RUB">
<subSection id=2 Name ="Кофейники" >
<item articul=123 NAme="Кофейник Филипс" price=12 Currency = "USD">
<item articul=123 NAme="Кофейник в PHP" price=1236 Currency = "RUB">

и т.д....
Есть несколько способов - все зависит от реального применения
Вот один из них.

1. Считываем таблицу - разделы прайса в массив (как правило их не много) - думаю код приводить не надо.
1а. Создаем DOM документ

$dom = new_xmldoc("1.0" );
$root= $dom->add_root("Price");


2. делаем цикл по каждому разделу (подразделу....) в массиве.
2.a. Не забудем в каждом цикле сделать по чилду.
$sect = $root->add_child("Section","" );
domxml_set_attribute($sect,'id', $i );
domxml_set_attribute($sect,'Name', $SectionName[$i] );

аналогично и для подсекции....

$subsect = $sect->add_child("subSection","" );
domxml_set_attribute($sect,'id', $j );
domxml_set_attribute($sect,'Name', $subSectionName[$i][$j] );


3. далее в цикле формируем серию запросов
$SQLString="SELECT * from price WHERE (sect = ". @sect[$i].") AND (subsect = "+@subsect[$j].")";
4. и выполняем его ---

$result2 = mysql_query ($SQLString)
or die (" query failed ");

5. циклом проходимся по результирующему массиву и генерим по чилду
while ($line = mysql_fetch_array($result2)) {
$item = $subsect->add_child("item","" );
domxml_set_attribute($item,'articlil', $line[articl] );
domxml_set_attribute($item,'price', $line[price] );
domxml_set_attribute($item,'Currency', $line[valuta] );***

}
*** - здесь я прошу обратить внимание, что генерится аттрибут Currency, а данные берутся из поля valuta
Тем и примечателен как XML так и его ручная обработка, ЧТО ВЫХОДНОЙ ДОКУМЕНТ НЕ ДОЛЖЕН ЗАВИСИТЬ ОТ СТРУКТУРЫ БД

все автоматизированные навороты типи SQLXML - ставят в зависимость структуру БД и СТРУКТУРУ выходного документа

A ПРАКТИКА ОБМЕНА ДАННЫМИ ГОВОРИТ, что есть строго определенная структура данных, закрепленная соглашением, спецификацией или стандартом,
и необходимо привязываться уже к ней. А настраивать xdr-файлы намного сложнее чем написать туже обработку в ручную.



все предельно прсто, только вот вопрос, что делать с этим XML-прайсом....

Лично я его уже преобразую в видимую форму на стороне клиента (просто так исторически сложилось, что HTML страница использует в качестве данных xml файл.)
хотя все это можно и без заморочек формировать и на стороне сервера.

У кого есть какие концептуальные идеи на этот счет????
 
Сверху