2010-05-17 100 views
9

有没有从MySQL查询直接获取输出到XML的机会?来自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中实现这一点?

在此先感谢您的答案。

回答

3

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

不是来自MySQL的XML,因为需要Perl解释器......我喜欢它! => +1 – lexu 2010-05-17 10:48:40

+0

嗨,我想从MySQL没有任何解释器的XML。任何解决方案 – user123456 2016-06-09 09:46:55

9

命令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处理器(如xsltprocsaxon),则可以将mysql的输出直接传输到XSLT程序中。例如:

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

这只给出了泛型元素名称的平坦结果,它与MSSQL的'FOR XML'实际上没有可比性。 – Emyr 2017-01-25 17:52:13

+0

@Emyr,你是对的。 OP要求的是MSSQL的功能。我会用XSLT来做。我会为此更新我的答案。 – 2017-01-27 04:30:27