2010-05-17 15 views
9

c'è qualche possibilità di ottenere l'output da una query MySQL direttamente in XML?Output XML da MySQL

Im riferendosi a qualcosa di simile a MSSQL è con SQL-XML plug-in, ad esempio:

SELECT * FROM table WHERE 1 FOR XML AUTO 

restituisce il testo (o tipo di dati XML in MSSQL per la precisione), che contiene una struttura di markup XML generato in base alle colonne nella tabella.

Con SQL-XML c'è anche la possibilità di definire in modo esplicito la struttura XML output come questo:

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 

che genera un codice XML come segue:

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

Do hai qualche idea su come ottenere questo in MySQL?

Grazie in anticipo per le vostre risposte.

risposta

3

Using XML with MySQL sembra essere un buon punto di partenza con vari modi diversi per passare dalla query MySQL all'XML.

Dall'articolo:

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

Non un XML da MySQL, poiché è necessario un interprete Perl ... Mi piace però! => +1 – lexu

+0

Ciao, voglio un XML da MySQL senza alcun interprete. Qualche soluzione? – user123456

9

Il comando mysql può output XML direttamente, utilizzando l'opzione --xml, che è disponibile, almeno fin dal MySql 4.1.

Tuttavia, questo non consente di personalizzare la struttura dell'output XML. Il risultato sarà qualcosa di simile a questo:

<?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> 

E si desidera:

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

La trasformazione può essere fatto con XSLT utilizzando uno script come questo:

<?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> 

Questo è ovviamente il modo più verbose della sintassi MSSQL concisa, ma d'altra parte è molto più potente e può fare tutto ciò che non sarebbe possibile in MSSQL.

Se si utilizza un processore XSLT linea di comando come xsltproc o saxon, è possibile reindirizzare l'output di mysql direttamente nel programma XSLT. Ad esempio:

mysql -e 'select * from table' -X database | xsltproc script.xsl - 
+1

Questo dà un risultato semplice con nomi di elementi generici, non è davvero paragonabile con 'FOR XML' di MSSQL. – Emyr

+0

@ Emmy, hai ragione. L'OP chiedeva un equivalente alle funzionalità di MSSQL. Lo farei con XSLT. Aggiornerò la mia risposta per quello. –