代码之家  ›  专栏  ›  技术社区  ›  NumberFour

MySQL的XML输出

  •  9
  • NumberFour  · 技术社区  · 14 年前

    有没有可能将MySQL查询的输出直接转换成XML?

    我指的是类似MSSQL的东西 SQL-XML格式

    SELECT * FROM table WHERE 1 FOR XML AUTO
    

    返回包含生成的xml标记结构的文本(确切地说是MSSQL中的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
    

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

    你有什么线索可以在MySQL中实现这一点吗?

    提前谢谢你的回答。

    2 回复  |  直到 14 年前
        1
  •  2
  •   lexu    14 年前

    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 ();
    
        2
  •  14
  •   Neil Mayhew    8 年前

    这个 mysql --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数据库

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