9

是否有机会将 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 中实现这一点吗?

提前感谢您的回答。

4

2 回答 2

14

该命令可以使用--xmlmysql选项直接输出 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 处理器,例如xsltprocor saxon,您可以通过管道将 的输出mysql直接传递到 XSLT 程序中。例如:

mysql -e 'select * from table' -X database | xsltproc script.xsl -
于 2014-01-15T21:14:14.783 回答
2

在 MySQL 中使用 XML似乎是从 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 ();
于 2010-05-17T08:50:04.117 回答