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

このコマンドは、少なくともMySql 4.1までさかのぼって使用できる--xmlmysqlオプションを使用して、XMLを直接出力できます。

ただし、これでは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では不可能なあらゆる種類のことを実行できます。

xsltprocまたはなどのコマンドラインXSLTプロセッサを使用する場合は、の出力をXSLTプログラムに直接saxonパイプできます。mysql例えば:

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 に答える