Вывод XML из MySQL - PullRequest
       13

Вывод XML из MySQL

9 голосов
/ 17 мая 2010

есть ли шанс получить выходные данные запроса MySQL непосредственно в XML?

Я имею в виду что-то вроде MSSQL с плагином SQL-XML , например:

SELECT * FROM table WHERE 1 FOR XML AUTO

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

С SQL-XML также имеется возможность явного определения структуры выходного XML, например:

SELECT
  1       AS tag,
  NULL    AS parent,
  emp_id  AS [employee!1!emp_id],
  cust_id    AS [customer!2!cust_id],
  region    AS [customer!2!region]
 FROM table
 FOR XML EXPLICIT

, который генерирует код XML следующим образом:

<employee emp_id='129'>
   <customer cust_id='107' region='Eastern'/>
</employee>

У вас есть какие-либо подсказки, как этого добиться в MySQL?

Заранее спасибо за ваши ответы.

Ответы [ 2 ]

11 голосов
/ 16 января 2014

Команда mysql может выводить XML напрямую, используя опцию - xml , которая доступна по крайней мере начиная с MySql 4.1.

Однако это не позволяет настраивать структуру вывода XML. Будет выведено что-то вроде этого:

<?xml version="1.0"?>
<resultset statement="SELECT * FROM orders" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
    <field name="emp_id">129</field>
    <field name="cust_id">107</field>
    <field name="region">Eastern</field>
  </row>
</resultset>

А ты хочешь:

<?xml version="1.0"?>
<orders>
  <employee emp_id="129">
    <customer cust_id="107" region="Eastern"/>
  </employee>
</orders>

Преобразование можно выполнить с помощью XSLT , используя такой скрипт:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="resultset">
    <orders>
      <xsl:apply-templates/>
    </orders>
  </xsl:template>

  <xsl:template match="row">
    <employee emp_id="{field[@name='emp_id']}">
      <customer
        cust_id="{field[@name='cust_id']}"
        region="{field[@name='region']}"/>
    </employee>
  </xsl:template>

</xsl:stylesheet>

Это, очевидно, более многословно, чем краткий синтаксис MSSQL, но, с другой стороны, он намного мощнее и может делать все, что было бы невозможно в MSSQL.

Если вы используете процессор XSLT из командной строки, такой как xsltproc или saxon, вы можете направить вывод mysql непосредственно в программу XSLT. Например:

mysql -e 'select * from table' -X database | xsltproc script.xsl -
2 голосов
/ 17 мая 2010

Использование XML с MySQL кажется хорошим местом для начала с различных способов перехода от MySQL к XML.

Из статьи:

   use strict;
   use DBI;
   use XML::Generator::DBI;
   use XML::Handler::YAWriter;

   my $dbh = DBI->connect ("DBI:mysql:test",
                           "testuser", "testpass",
                           { RaiseError => 1, PrintError => 0});
   my $out = XML::Handler::YAWriter->new (AsFile => "-");
   my $gen = XML::Generator::DBI->new (
                                   Handler => $out,
                                   dbh => $dbh
                               );
   $gen->execute ("SELECT name, category FROM animal");
   $dbh->disconnect ();
...