多くの場合、XMLドキュメントには階層データが含まれています。階層データでは、会社の組織図のように、データが各種のレベルに構造化されています。階層構造は1対多の関係を表します。最上位の項目は、1つまたは複数の下位項目(顧客や注文など)を持ちます。
この例では、XMLドキュメントを、関連情報を含んでいる2つのデータセットとしてインポートするためには、どのようにXMLMapを定義すればよいかを示します。
XMLドキュメントPharmacy.XMLの内容を次に示します。このファイルには、個々の顧客とその処方箋という形式で複数の関連エンティティを持つ階層データが含まれています。各顧客は、1つまたは複数の処方箋を持つことができます。PRESCRIPTION要素が、開始タグ<PERSON>と終了タグ</PERSON>に囲まれた各領域内でネストされていることに注意してください。
<?xml version="1.0" ?>
<PHARMACY>
<PERSON>
<NAME>Brad Martin</NAME>
<STREET>11900 Glenda Court</STREET>
<CITY>Austin</CITY>
<PRESCRIPTION>
<NUMBER>1234</NUMBER>
<DRUG>Tetracycline</DRUG>
</PRESCRIPTION>
<PRESCRIPTION>
<NUMBER>1245</NUMBER>
<DRUG>Lomotil</DRUG>
</PRESCRIPTION>
</PERSON>
<PERSON>
<NAME>Jim Spano</NAME>
<STREET>1611 Glengreen</STREET>
<CITY>Austin</CITY>
<PRESCRIPTION>
<NUMBER>1268</NUMBER>
<DRUG>Nexium</DRUG>
</PRESCRIPTION>
</PERSON>
</PHARMACY>
顧客情報を含むものと処方箋情報を含むものという2つの独立したデータセットをインポートするには、各顧客とそれに関連付けられている処方箋との間の関係を指定することにより、個々の顧客に帰属する処方箋を明確化する必要があります。
XMLMapは、XMLマークアップを2つのSASデータセットに変換する方法を定義します。データセットPersonは、各顧客の名前と住所をインポートします。一方、データセットPrescriptionは、顧客名、処方箋番号、処方薬をインポートします。XMLMap構文の表記については次の説明を参照してください。
注: SAS XML Mapperを使用して生成したXMLMapの内容を次に示します。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ############################################################ -->
<!-- 2012-10-15T13:02:32 -->
<!-- SAS XML Libname Engine Map -->
<!-- Generated by XML Mapper, 904000.4.0.20120905190000_v940 -->
<!-- ############################################################ -->
<!-- ### Validation report ### -->
<!-- ############################################################ -->
<!-- XMLMap validation completed successfully. -->
<!-- ############################################################ -->
<SXLEMAP name="AUTO_GEN" version="2.1"> 1
<NAMESPACES count="0"/>
<!-- ############################################################ -->
<TABLE description="PERSON" name="PERSON"> 2
<TABLE-PATH syntax="XPath">/PHARMACY/PERSON</TABLE-PATH>
<COLUMN name="NAME"> 3
<PATH syntax="XPath">/PHARMACY/PERSON/NAME</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>11</LENGTH>
</COLUMN>
<COLUMN name="STREET"> 3
<PATH syntax="XPath">/PHARMACY/PERSON/STREET</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>18</LENGTH>
</COLUMN>
<COLUMN name="CITY"> 3
<PATH syntax="XPath">/PHARMACY/PERSON/CITY</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>6</LENGTH>
</COLUMN>
</TABLE>
<!-- ############################################################ -->
<TABLE description="PRESCRIPTION" name="PRESCRIPTION"> 4
<TABLE-PATH syntax="XPath">/PHARMACY/PERSON/PRESCRIPTION</TABLE-PATH>
<COLUMN name="NAME" retain="YES"> 5
<PATH syntax="XPath">/PHARMACY/PERSON/NAME</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>11</LENGTH>
</COLUMN>
<COLUMN name="NUMBER"> 6
<PATH syntax="XPath">/PHARMACY/PERSON/PRESCRIPTION/NUMBER</PATH>
<TYPE>numeric</TYPE>
<DATATYPE>integer</DATATYPE>
</COLUMN>
<COLUMN name="DRUG"> 6
<PATH syntax="XPath">/PHARMACY/PERSON/PRESCRIPTION/DRUG</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>12</LENGTH>
</COLUMN>
</TABLE>
</SXLEMAP>
1 |
SXLEMAPは、2つのSASデータセットを定義するルート包含要素です。 |
2 |
最初のTABLE要素は、Personデータセットを定義します。 |
3 |
続くCOLUMN要素は、Personデータセット内の変数Name、Street、Cityの属性を指定します。 |
4 |
2番目のTABLE要素は、Prescriptionデータセットを定義します。 |
5 |
続くCOLUMN要素は、Prescriptionデータセット内の変数Nameの属性を指定します。変数Nameの値が異なる値に置き換えられるまで各オブザベーションで保持されるようにするために、retain="YES" 属性を指定します(retain=属性はSAS DATAステップのRETAINステートメントに類似した機能であり、これを使うことにより、DATAステップの反復間で特定の変数の値が保持されるように設定できます)。
|
6 |
続くCOLUMN要素は、Prescriptionデータセット内の変数NumberおよびDrugの属性を指定します。 |
次のSASステートメントは、XMLドキュメントをインポートして、XMLMapを指定します。
filename pharm 'C:\My Documents\Pharmacy.xml';
filename map 'C:\My Documents\Pharmacy.map';
libname pharm xmlv2 xmlmap=map;
次のDATASETSプロシジャを実行すると、SASシステムが、XMLドキュメントPharmacy.XMLを2つのSASデータセットPHARM.PERSONおよびPHARM.PRESCRIPTIONに変換したことを確認できます。
proc datasets library=pharm;
quit;
PHARMライブラリのDATASETSプロシジャ出力
インポートされた2つのSASデータセットのPRINTプロシジャ出力は次のようになります。
PHARM.PERSONのPRINTプロシジャ出力
PHARM.PRESCRIPTIONのPRINTプロシジャ出力