2010-05-17 16 views
9

¿hay alguna posibilidad de obtener el resultado de una consulta MySQL directamente en XML?Salida XML de MySQL

Im refiriéndose a algo así como MSSQL tiene con SQL-XML plugin, por ejemplo:

SELECT * FROM table WHERE 1 FOR XML AUTO 

declaraciones de texto (o tipo de datos XML en MSSQL para ser exactos) que contiene una estructura de marcado XML generados según las columnas de la tabla.

Con SQL-XML También hay una opción de definir explícitamente la estructura XML salida como esta:

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 

que genera un código XML de la siguiente manera:

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

Do ¿Tienes alguna pista de cómo lograr esto en MySQL?

Gracias de antemano por sus respuestas.

Respuesta

3

Using XML with MySQL parece ser un buen lugar para comenzar con varias formas diferentes de obtener consultas de MySQL a XML.

Desde el artículo:

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

No es un XML de MySQL, ya que se necesita un intérprete de Perl ... ¡Pero me gusta! => +1 – lexu

+0

Hola, quiero un XML de MySQL sin ningún intérprete. Alguna solución ? – user123456

9

El comando mysql puede generar archivos XML directamente, usando la opción --xml, que está disponible al menos tan atrás como MySQL 4.1.

Sin embargo, esto no le permite personalizar la estructura de la salida XML. Que sería algo como esto:

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

Y desea:

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

La transformación se puede realizar con XSLT usando un script como el siguiente:

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

Esto es, obviamente, mucho más sintaxis concisa que la concisa MSSQL, pero por otro lado es mucho más poderosa y puede hacer todo tipo de cosas que no serían posibles en MSSQL.

Si utiliza un procesador XSLT de línea de comandos como xsltproc o saxon, puede conectar la salida de mysql directamente al programa XSLT. Por ejemplo:

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

Esto solo da un resultado plano con nombres genéricos de elementos, no es realmente comparable con 'FOR XML' de MSSQL. – Emyr

+0

@Emyr, tienes razón. El OP estaba pidiendo un equivalente a la funcionalidad de MSSQL. Lo haría con XSLT. Voy a actualizar mi respuesta para eso. –

Cuestiones relacionadas