前のページ|次のページ

カスタマイズしたタグセットを使用し、XMLドキュメントをエクスポートする

例の概要

次の例では、カスタマイズしたタグセットを定義した後、そのタグセットをXML Engineと共に使用することにより、カスタマイズされたタグを含むXMLドキュメントをエクスポートしています。

TEMPLATEプロシジャによるカスタマイズしたタグセットの定義

次に示すTEMPLATEプロシジャは、Tagsets.Customという名前のカスタマイズしたタグセットを定義しします。
次のプログラムをテンプレートとして使用することで、ユーザー独自のカスタマイズしたタグセットを定義できます。たとえば、EmitMeta、EmitRow、EmitColの各イベントを少し変更するだけで、ユーザー独自のカスタマイズしたタグセットを作成できます。
proc template;

   /* +------------------------------------------------+
      |                                                |
      +------------------------------------------------+ */

   define tagset tagsets.custom ;
      notes "SAS XML Engine output event model(interface)";

      indent = 3;
      map = '<>&"''';
      mapsub = '/&lt;/&gt;/&amp;/&quot;/&apos;/';


   /* +------------------------------------------------+
      |                                                |
      +------------------------------------------------+ */

      define event XMLversion;
         put  '<?xml version="1.0"';
         putq ' encoding=' ENCODING;
         put  ' ?>' CR;
         break;
      end;


      define event XMLcomment;
         put  '<!-- ' CR;
         put  '     ' TEXT CR;
         put  '  -->' CR;
         break;
      end;


      define event initialize;
      set   $LIBRARYNAME          'LIBRARY' ;
      set   $TABLENAME            'DATASET' ;
      set   $COLTAG               'column' ;
      set   $META                 'FULL' ;

      eval  $is_engine            1;
      eval  $is_procprint         0;
      eval  $is_OUTBOARD          1;
      end;


   /* +------------------------------------------------+
      |                                                |
      +------------------------------------------------+ */

      define event doc;
      start:
         trigger initialize;
         trigger XMLversion;
         break;
      finish:
         break;
      end;


      define event doc_head;
      start:
         break;
      finish:
         break;
      end;


      define event doc_body;
      start:
         break;
      finish:
         break;
      end;


      define event proc;
      start:
         break / if frame_name ;              /* set by ODS statement use  */
         eval $is_OUTBOARD 0 ;                /* default for non-engine    */
         do / if cmp(XMLCONTROL, "OUTBOARD"); /* only the engine sets this */
            eval $is_OUTBOARD 1 ;
         else ;
            eval $is_OUTBOARD 0 ;
         done ;
         break;
      finish:
         break;
      end;


      define event leaf;
      start:
         /*
          *  PROC PRINT
          *  data set reference is in the value and label fields
          *  and NOT in the output_label field
          */
         eval $is_engine     0; /* NOT ENGINE */
         break / if ^cmp("Print", name);
         eval $is_procprint  1; /* PROC PRINT */
         eval $regex prxparse("/\.(.+)/");
         eval $match prxmatch($regex, value);
         set  $TABLENAME prxposn($regex, 1, value);
         break;
      finish:
         break;
      end;


      define event output;
      start:
         break / if $is_procprint ;
         eval  $is_engine     0;            /* NOT ENGINE   */
         set   $TABLENAME name / if name;   /* TABLE VIEWER */
         break;
      finish:
         break;
      end;


      define event table;
      start:
         unset $col_names;
         unset $col_types;
         unset $col_width;
         eval  $index      1;
         eval  $index_max  0;
         set   $TABLENAME name / if name;           /* LIBNAME ENGINE */
         set   $META XMLMETADATA / if XMLMETADATA ; /* LIBNAME ENGINE */
         set   $SCHEMA XMLSCHEMA / if XMLSCHEMA ;   /* LIBNAME ENGINE */
         break;
      finish:
         break;
      end;


      define event colspecs;
      start:
         break / if cmp(XMLMETADATA, "NONE");
      finish:
         break / if cmp(XMLMETADATA, "NONE");
      end;


      define event colgroup;
      start:
         break / if cmp(XMLMETADATA, "NONE");
      finish:
         break / if cmp(XMLMETADATA, "NONE");
      end;


   /* +------------------------------------------------+
      |                                                |
      +------------------------------------------------+ */

      define event colspec_entry;
      start:
         break / if ^$is_engine and $index eq 1 and cmp(name, "Obs");
         eval  $index_max $index_max+1;
         set $col_names[] name;
         set $col_types[] type;
         set $col_width[] width;
         break;
      finish:
         break;
      end;


      define event table_head;
      start:
         break;
      finish:
         break;
      end;


      define event table_body;
      start:
         trigger EmitMeta ;
         break;
      finish:
         trigger EmitMeta ;
         break;
      end;

   /* +------------------------------------------------+
      |                                                |
      +------------------------------------------------+ */

      define event row;
      start:
         break / if !cmp(SECTION, "body");
         break / if cmp(XMLMETADATA, "ONLY");
         eval    $index 1;
         unset   $col_values;
         break;
      finish:
         break / if !cmp(SECTION, "body");
         break / if cmp(XMLMETADATA, "ONLY");
         trigger EmitRow ;
         break;
      end;


      define event data;
      start:
         break / if !cmp(SECTION, "body");
         do / if $is_engine ;
            break / if !cmp(XMLCONTROL, "Data");
         else ;
            break / if !cmp(HTMLCLASS, "Data");
         done ;
         break / if cmp(XMLMETADATA, "ONLY");
         set $name $col_names[$index];
         do / if exists(MISSING);
            eval  $is_MISSING  1;
            eval  $value_MISSING MISSING;
            set   $col_values[$name] " ";
         else ;
            eval  $is_MISSING  0;
            set   $col_values[$name] VALUE;
         done;
         break;
      finish:
         break / if !cmp(SECTION, "body");
         do / if $is_engine ;
            break / if !cmp(XMLCONTROL, "Data");
         else ;
            break / if !cmp(HTMLCLASS, "Data");
         done ;
         break / if cmp(XMLMETADATA, "ONLY");
         set  $name  $col_names[$index];
         eval $index $index+1;
         break;
      end;


   /* +------------------------------------------------+
      |                                                |
      | at this point, we just take over XML output.   |
      | EmitRow() is triggered each time the data is   |
      |           loaded into the $col_values array.   |
      |                                                |
      | we can output anything we desire from here...  |
      |                                                |
      +------------------------------------------------+ */

      define event EmitMeta; 1
      start:
         put '<' $LIBRARYNAME '>' CR ;
         put '   <!-- ' CR ;
         put '        List of available columns' CR  ;

         eval $index  1;
         iterate $col_names ;
         do /while _value_;
            put '           ' $index ' ' _value_ CR  ;
            next $col_names;
            eval $index $index+1;
            done;
         put '   -->' CR ;
         break;
      finish:
         put '</' $LIBRARYNAME '>' ;
         break;
      end;


      define event EmitRow; 2
         ndent;
         put "<STUDENT>" CR ;
         ndent;

         set $name  "Name";   trigger EmitCol ;
         set $name  "Height"; trigger EmitCol ;
         set $name  "Weight"; trigger EmitCol ;

         xdent;
         put "</STUDENT>" CR ;
         xdent;
         break;
      end;


      define event EmitCol; 3
         unset $value;
         set $value $col_values[$name];
         put '<'  $name '>' ;
         put      $value ;
         put '</' $name '>' CR ;
         break;
      end;

   end; /* custom */
run;
1 EmitMetaイベントは、SASデータセット内にある変数のリストを含むXMLコメントを生成します。このイベントには、リスト変数を反復して使用することでSASデータセット内のすべての変数を処理する例が含まれています。反復処理に関する詳細は、SAS Output Delivery System: ユーザーガイドにあるTEMPLATEプロシジャのDEFINE EVENTステートメントにおけるITERATEステートメントの説明を参照してください。
2 EmitRowイベントは、SASデータセットの3つのオブザベーションからXML出力を生成します。EmitRowイベントは、処理対象の具体的な変数(Name、Height、Weight)を指定します。
3 EmitColイベントは、処理対象となる変数ごとに、汎用的な見かけのXMLを生成します。

カスタマイズしたタグセットを使用したXMLドキュメントのエクスポート

次のSASプログラムは、カスタマイズしたタグセットを使用して、SASデータセットをXMLドキュメントとしてエクスポートします。
data work.class; 1
   set sashelp.class (obs=3);
run;

filename xmlout "C:\My Documents\XML\engine92.xml"; 2

libname xmlout xml xmltype=GENERIC tagset=tagsets.custom; 3

data xmlout.class; 4
   set work.class;
run;
1 このDATAステップは、3つのオブザベーションのみを含むデータセットWORK.CLASSを作成します。
2 このFILENAMEステートメントは、ファイル参照名XMLOUTを、エクスポートされたXMLドキュメントが格納されるファイルの物理的な場所(完全なパス名、ファイル名、ファイル拡張子を含むもの)に割り当てます。
3 このLIBNAMEステートメントは、このファイル参照名を使用してXMLドキュメントを参照し、エンジンとしてXML Engineを指定します。TAGSET=オプションでは、カスタマイズしたタグセットTagsets.Customを指定します。
4 このDATAステップは、データセットWORK.CLASSを読み込み、カスタマイズしたタグセットにより定義されている形式で、読み込んだ内容を指定のXMLドキュメントに出力します。
結果として生成されるXMLドキュメントの内容は次のようになります。
カスタマイズしたタグセットを使用したXMLドキュメントのエクスポート
<?xml version="1.0" encoding="windows-1252" ?> <LIBRARY> <!-- List of available columns 1 Name 2 Sex 3 Age 4 Height 5 Weight --> <STUDENT> <Name>Alfred</Name> <Height>69</Height> <Weight>112.5</Weight> </STUDENT> <STUDENT> <Name>Alice</Name> <Height>56.5</Height> <Weight>84</Weight> </STUDENT> <STUDENT> <Name>Barbara</Name> <Height>65.3</Height> <Weight>98</Weight> </STUDENT> </LIBRARY>
前のページ|次のページ|ページの先頭へ