[Oracle] XMLを見やすく整形して出力する方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracleの表の列にXMLを文字列として格納している場合、そのXMLが改行やインデントを使って整形されたものであれば検索した時に見やすいですが、そうでなければ非常に見づらいものです。

例えば、以下のような改行もインデントもされていないXMLが格納されている場合、
<DATA><顧客 id="1"><氏名>佐藤</氏名><住所>東京都港区○○○○</住所><電話番号>03-XXXX-XXXX</電話番号><FAX番号>03-XXXX-XXXX</FAX番号><E-MAIL>XXXXXX@XXXXXX.co.jp</E-MAIL></顧客><顧客 id="2"><氏名>鈴木</氏名><住所>大阪市北区○○○○</住所><電話番号>06-XXXX-XXXX</電話番号><FAX番号>06-XXXX-XXXX</FAX番号><E-MAIL>YYYYYY@YYYYYY.ne.jp</E-MAIL></顧客></DATA>
これをこのまま検索して見るのは結構つらいものがありますが、OracleでサポートされているXML関係の拡張機能を活用すれば、このようなXMLに改行やインデントを加えて見やすく整形して表示・出力(いわゆるpretty print)することができます。

まず、以下のようなファンクションを作成します。

CREATE OR REPLACE FUNCTION PRETTY_PRINT_XML
(
  p_xml VARCHAR2
)
RETURN VARCHAR2
IS
  wk_xml CLOB;
BEGIN

  IF p_xml IS NULL THEN
    wk_xml := null;
  ELSE
    DBMS_XMLDOM.WRITETOCLOB(
    DBMS_XMLDOM.MAKENODE(DBMS_XMLDOM.NEWDOMDOCUMENT(XMLTYPE.CREATEXML(p_xml))),
    wk_xml
  );
  END IF;
  RETURN wk_xml;

EXCEPTION
  WHEN OTHERS THEN
    RETURN null;
END;
/
このファンクションでは、まず引数で渡されたXML文字列をOracleのXMLTYPEというデータ型に変換し、それをDOMドキュメント化し、さらにノードを作成し、CLOBに書き出しています。

(本来はばらして書くべきなのかもしれないですが、つなげて書いてみました^^ゞ)


で、このファンクションを以下のようにSELECT文の中で使ってやれば、整形されたXMLが出力されます。

SELECT PRETTY_PRINT_XML(XML_DATA) FROM XML_TABLE;

PRETTY_PRINT_XML(XML_DATA)
----------------------------------------------------------------------------------------------------

<DATA>
  <顧客 id="1">
    <氏名>佐藤</氏名>
    <住所>東京都港区○○○○</住所>
    <電話番号>03-XXXX-XXXX</電話番号>
    <FAX番号>03-XXXX-XXXX</FAX番号>
    <E-MAIL>XXXXXX@XXXXXX.co.jp</E-MAIL>
  </顧客>
  <顧客 id="2">
    <氏名>鈴木</氏名>
    <住所>大阪市北区○○○○</住所>
    <電話番号>06-XXXX-XXXX</電話番号>
    <FAX番号>06-XXXX-XXXX</FAX番号>
    <E-MAIL>YYYYYY@YYYYYY.ne.jp</E-MAIL>
  </顧客>
</DATA>
この例では整形する元となるXML文字列はVARCHAR2型ですが、元がCLOB型の場合でもファンクションの引数の型をCLOB型に変えてやればOKです。

また、ファンクションの中で使用しているDBMS_XMLDOM.WRITETOCLOBというプロシージャはCLOB型に出力するものですが、この他にWRITETOBUFFERやWRITETOFILEというプロシージャも用意されていますので、出力先に応じて使い分けることができます。


詳しくは「XML データベース開発者ガイド- Oracle XML DB」や「Oracle9i XML API リファレンス- XDK およびOracle XML DB」を参照のこと。



【関連エントリ】
[Oracle] XMLTypeへのXML文書の格納 2005/08/10
[Oracle] XMLSchemaに基づいたXMLType列を含む表の作成方法 2005/08/15
[Oracle] XMLSchema基づかないXMLType列を含む表の作成方法 2005/08/22
[Oracle] XMLを見やすく整形して出力する方法 2005/12/07