Генерация XML

HabaHaba

Новичок
Генерация XML

Привет, коллеги :)
Решил я тут, в свете задачки требующей передачи данный между сторонними конторами, взглянуть в сторону XML. Взгланул.... вроде понравилось :)
Создал DTD-шку, ну, думаю, щас я вам покажу! И застрял...
Застрял на том, что данные то лежат у меня в MySQL, а нужно преобразовать в XML.
Делать что то типа:
PHP:
while($row=mysql_fetch_array($query)) {
     $xml.="<something ID=$row[id]>$row[name]</something>";
}
не особо хочется... Как то некрасиво это.
Вот, собственно, и возник вопрос - Как покрасивше и понадежней генерить XML.
Желательно, на основе DTD или что то типа того :)
 

slach

Новичок
гхм...
в поиск... ищи sql2xml
но вообще задача то сводится к простой ф-ции
есть Рекордсет

его необходимо преобразовать в XML
причем заметь, XML-строка и Дерево XML-объектов (DOM) по сути разные вещи
как это сделать ?
простейший вариант как ты и сказал
через строку...
у меня например это выглядит вот так
вариант кстати ОЧЕНЬ не безупречный...
просто написано год назад... и сейчас на этой ф-ции многое навешано =)

PHP:
function rs2xml(&$rs,$rs_name='Default',$rs_attrs='',$cdata=false,$lengths=false,$bradd=false) {
 $out ='';$rows=0;$rowcnt=0;
 if (!is_object($rs)) return '';
 $ncols = $rs->FieldCount();
 $nrows = $rs->RecordCount();

 $out = "\n".' <SET name="'.$rs_name.'"'.(strlen($rs_attrs)?' '.$rs_attrs:'').' cols="'.$ncols.'" rows="'.$nrows.'">';
 while (!$rs->EOF) {
  $out .= "\n".'  <ROW num="'.$rowcnt.'">';
  foreach ($rs->fields as $k=>$v) {
    $length=($lengths) ? ' length="'.strlen($v).'"' : '';
    if (strstr('xml',$k) && $cdata) $out.="\n".'   <COL'.$length.' name="'.$k.'"><![CDATA['.$v.']]></COL>';
    elseif (!is_integer($k)) $out .= "\n".'   <COL'.$length.' name="'.$k.'">'.($bradd ? str_replace("\n",'&lt;br&gt;',$v) : $v).'</COL>';
  }
  $out .= "\n".'  </ROW>';
  $rs->MoveNext();
  $rowcnt++;
 } // while

 $out.="\n".' </SET>';
 return $out;
}
ЗЫ. что то в форуме какие то левые символы появляются в моих постингах... не просто так
 

HabaHaba

Новичок
Автор оригинала: slach
простейший вариант как ты и сказал
через строку...
Ты правильно заметил - "как я и сказал". Дело в том, что если это единственный способ по человечески сгенерить XML - то
по моему XML-ю ещё необходимо долго и нудно рости :)
А по поводу тривиальности задачи, наверное я плохо раскрыл тему :)
Я хотел бы не просто перевести содержание SQL таблицы в XML, а сгенерить XML из достаточно сложного запроса, причем по моему шаблону.
Я смотрел что за XML генерит MySQL... Это просто тихий ужас.
Сейчас сунулся в Java, но и там пока не нашел однозначенного решения.
 

slach

Новичок
гхм ????
ты ничего не путаешь ??
MySQL никаких XML'ек не генерит =)

вот MSSQL генерить умеет
и кстати вполне не плохо
да и ADODB.Recordset.save() метод еще никто не отменял...
разве что тебя напрягло то, что он значения полей в атрибуты скидывает...
============
но речь не об этом

таки я думаю, что задача тривиальна =)

1) запрос ЛЮБОЙ сложности к ЛЮБОЙ SQL базе, в итоге выдаст тебе либо обычный рекордсет (таблицу результатов), либо "флаг состояния" (ну что то типа 100 records deleted)

2) DTD - это не описание формата документа... это всего лишь набор правил (с не самым удобным синтаксисом), в соответсвии с которым парсер производит валидацию XML'дерева-тегов и дает добро на то, чтобы XML документ назывался не WELL-formed а VALID

так что генерить тебе через rs2xml придется
а как обзывать теги конкретные...
это можно и через параметры сделать...

таки есть еще такая вещь как DOMXML посмотри постинги [DAN] недавние в этот форум... там даже примеры кода есть...
может в этом направлении стоит думать

идея в общем то простая...
в ф-цию передается XML-нода (объект из дерева DOMXML документа) и рекордсет (результат выполнения ф-ции mysql_query)

ну а дальше через add_child() заводятся в этой ноде "детишки"...
 

erudit

Guest
Автор оригинала: slach
гхм...
в поиск... ищи sql2xml
но вообще задача то сводится к простой ф-ции
есть Рекордсет

его необходимо преобразовать в XML
причем заметь, XML-строка и Дерево XML-объектов (DOM) по сути разные вещи
как это сделать ?
простейший вариант как ты и сказал
через строку...
у меня например это выглядит вот так
вариант кстати ОЧЕНЬ не безупречный...
просто написано год назад... и сейчас на этой ф-ции многое навешано =)

PHP:
function rs2xml(&$rs,$rs_name='Default',$rs_attrs='',$cdata=false,$lengths=false,$bradd=false) {
 $out ='';$rows=0;$rowcnt=0;
 if (!is_object($rs)) return '';
 $ncols = $rs->FieldCount();
 $nrows = $rs->RecordCount();

 $out = "\n".' <SET name="'.$rs_name.'"'.(strlen($rs_attrs)?' '.$rs_attrs:'').' cols="'.$ncols.'" rows="'.$nrows.'">';
 while (!$rs->EOF) {
  $out .= "\n".'  <ROW num="'.$rowcnt.'">';
  foreach ($rs->fields as $k=>$v) {
    $length=($lengths) ? ' length="'.strlen($v).'"' : '';
    if (strstr('xml',$k) && $cdata) $out.="\n".'   <COL'.$length.' name="'.$k.'"><![CDATA['.$v.']]></COL>';
    elseif (!is_integer($k)) $out .= "\n".'   <COL'.$length.' name="'.$k.'">'.($bradd ? str_replace("\n",'&lt;br&gt;',$v) : $v).'</COL>';
  }
  $out .= "\n".'  </ROW>';
  $rs->MoveNext();
  $rowcnt++;
 } // while

 $out.="\n".' </SET>';
 return $out;
}
ЗЫ. что то в форуме какие то левые символы появляются в моих постингах... не просто так
пардон за глупый вопрос. а $rs в данном конексте что? какой свой объект или чтонить вроде mysql_fetch_object() (в чем глубоко сомневаюсь)
 

DJ Rabbit

Guest
Я вот тут думал, думал и понял: во-превых генерить в php-коде xml как string неудобно, во-вторых, использовать для генерации xml класс шаблона тоже сложно (при больших изменениях в сайте это будет ой-ой-ой сколько проблем). Думаю попробовать поиграться с DOM, чтобы с его помощью генерить XML. Т.е. делаем аналог класса шаблона, который работает не с большим текстом, а с DOM-структурой.
 

slach

Новичок
Автор оригинала: erudit

пардон за глупый вопрос. а $rs в данном конексте что? какой свой объект или чтонить вроде mysql_fetch_object() (в чем глубоко сомневаюсь)
да оно самое =))
посмотри на ADODB
я пользую переписанную немного под себя версию этой библиотеки
 

erudit

Guest
Автор оригинала: slach

да оно самое =))
посмотри на ADODB
я пользую переписанную немного под себя версию этой библиотеки
БОльшое человеческое спасибо за АДОдб :cool:
промыл мне, так сказать, глаза мылом :cool:
 

Alexandre

PHPПенсионер
C DOM тожек есть проблемки...
я вот на форуме примерчик привел

MySQL "научили" отдавать XML
посмотри, может что-то полезное и для себя найдешь...

у меня, как видишь, XML во всю обменивается с клиентами
 

Alexandre

PHPПенсионер
А вот как сюда сунуть АДО-ДиБи - или я глупый или смотрю не в ту сторону...

всю крышу свернул, а приложить их к MySQL ну ни как не получается. Подскажите пожайлуста... (лучше как для первоклассника)
 

Alexandre

PHPПенсионер
Ну и в догонку ко всему сказанному скажу, что самое эффективное генерить XML документы это:

1. держать всю Инфу в MySQL?,
2. а далее по простому или вложенному запросу осуществлять вывод данных...
3. генерить циклом по рекордсет длинную строку, куда писать данные и самому вставлять теги.

Работает надежно ир безотказно.
Не надо замарачиваться с библиотеками, которые еще работают в тестовом режиме и при больших объемах дают сбои

Пример кода:

while ($line = mysql_fetch_array($result2)) {
$str = $str .'<item>';
$str = $str .'<article>'. $line[articl] .'</article>';
$str = $str .'<price>'. $line[price] .'</price>';
$str = $str .'<currency>'. $line[valuta] .'</currency>';
$str = $str .'</item>';
}
и так и в том же роде.....
 

erudit

Guest
Автор оригинала: Alexandre
А вот как сюда сунуть АДО-ДиБи - или я глупый или смотрю не в ту сторону...

всю крышу свернул, а приложить их к MySQL ну ни как не получается. Подскажите пожайлуста... (лучше как для первоклассника)
да есть библиотека для пхп эмулирующая работу с АДО. ХОтя при этом можно работать с любой БД.
Вещь, конечно, во многом не однозначная, но если знаешь АДО работаешь со многими типа БД очень нужная.
 

Alexandre

PHPПенсионер
ссылки есть,
это меня заинтересовало,

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

Вопрос с платформой - серьезный.

Хотя , если есть Виндовозная платформа - то очень удобно использовать родной Виндовозный парсер - msXml.dll через COM библиотеки.
Работает надежнее и с ним привычнее дело иметь, чем с LibXML
 

erudit

Guest
Автор оригинала: Alexandre
ссылки есть,
это меня заинтересовало,

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

Вопрос с платформой - серьезный.

Хотя , если есть Виндовозная платформа - то очень удобно использовать родной Виндовозный парсер - msXml.dll через COM библиотеки.
Работает надежнее и с ним привычнее дело иметь, чем с LibXML
Да на пхп они написаны. Класс такой просто, написанный на пхп
в гугле поищи на PHP ADO
 

Alexandre

PHPПенсионер
Автор оригинала: erudit

Да на пхп они написаны. Класс такой просто, написанный на пхп
в гугле поищи на PHP ADO
За это спасибо, а как оцените мою простую идею - генерить ХМЛ доки простым циклом по рекордсет.
 

erudit

Guest
Автор оригинала: Alexandre

За это спасибо, а как оцените мою простую идею - генерить ХМЛ доки простым циклом по рекордсет.
эээх
ты хоть тред то читал?
вон функцию аж два раза привели, которая это делает.
да еще и с опцииями.
 

nail

Guest
Не вижу никаких проблем с генерацией XML-стрингов. Я сделал совершенно тупое решение из пары классов, которое позволит в дальнейшем перейти на DOM.
Среди прочего мусора найти его можно здесь: http://nail.pp.ru/sess_msg.html
На основе этого работает http://softlist.nail.pp.ru
 

erudit

Guest
Автор оригинала: nail
Не вижу никаких проблем с генерацией XML-стрингов. Я сделал совершенно тупое решение из пары классов, которое позволит в дальнейшем перейти на DOM.
Среди прочего мусора найти его можно здесь: http://nail.pp.ru/sess_msg.html
На основе этого работает http://softlist.nail.pp.ru
Ну да, это очевидно. Только я столкнулся с обратной проблемой. У меня уже было сделано на ДОМ (точнее на своем классе, который работал враппером между моим скриптом и ДОМ, чтобы при переходе с одной версии дом на другую не переписывать все) И теперь я хочу этот самый враппер заставить работать не с ДОМ а с обычной бд.
Все вроде просто, но у меня очень много Xpath запросов -совсем не представляю, как реализовать их поддержку при работе не с ДОМ а с БД 8-(
 
Сверху