W3C規格(section 4.6 Predefined Entities)では、文字データの場合、左山かっこ(<)、アンパサンド、アポストロフィー(')などの特定の文字は、<
、&
、'
のような文字参照または文字列を使用してエスケープする必要があると規定されています。たとえば、属性値に一重引用符や二重引用符を含める場合、一重引用符(')は'
として、二重引用符(")は"
として表されます。
非エスケープ文字を含んでいるXMLドキュメントをインポートするには、LIBNAMEステートメントでオプションXMLPROCESS=PERMITを指定して、W3C規格に従っていない文字データをXML
Engineが受け付けるようにします。このようにすると、アポストロフィー、二重引用符、アンパサンドのような非エスケープ文字が文字データとして受け付けられます。
注: XMLPROCESS=PERMITを使用する場合には注意が必要です。XMLドキュメントが非エスケープ文字を含んでいる場合、そのドキュメントの内容は標準的なXML構成ではありません。このオプションは、利便性のために提供されているものであり、無効なXMLマークアップを奨励するものではありません。
次の例では、非エスケープ文字データを含んでいるPermit.XMLというXMLドキュメントをインポートしています。
<?xml version="1.0" ?>
<PERMIT>
<CHARS>
<accept>OK</accept>
<status>proper escape sequence</status>
<ampersand>&</ampersand>
<squote>'</squote>
<dquote>"</dquote>
<less><</less>
<greater>></greater>
</CHARS>
<CHARS>
<accept>OK</accept>
<status>unescaped character in CDATA</status>
<ampersand>Abbott & Costello</ampersand>
<squote>Logan's Run</squote>
<dquote>This is "realworld" stuff</dquote>
<less> e < pi </less>
<greater> pen > sword </greater>
</CHARS>
<CHARS>
<accept>NO</accept>
<status>single unescaped character</status>
<ampersand>&</ampersand>
<squote>'</squote>
<dquote>"</dquote>
<less></less>
<greater></greater>
</CHARS>
<CHARS>
<accept>NO</accept>
<status>unescaped character in string</status>
<ampersand>Dunn & Bradstreet</ampersand>
<squote>Isn't this silly?</squote>
<dquote>Quoth the raven, "Nevermore!"</dquote>
<less></less>
<greater></greater>
</CHARS>
</PERMIT>
まず、デフォルトのXML Engineの動作を使用する例を示します。この場合、XML Engineは、XMLマークアップがW3C規格に従っていると仮定します。次のSASプログラムを実行すると、先頭の2つのオブザベーション(有効なXMLマークアップを含んでいるもの)だけがインポートされ、残りの2つのレコード(非エスケープ文字を含んでいるもの)に関してはエラーが生成されます。
libname permit xmlv2 'C:\My Documents\XML\permit.xml';
proc print data=permit.chars;
run;
SASログの出力
ERROR:There is an illegal character in the entity name. encountered during XMLInput parsing occurred at or near line 24, column 22 NOTE:There were 2 observations read from the data set PERMIT.CHARS.
LIBNAMEステートメントのオプションXMLPROCESS=PERMITを指定すると、XML EngineがこのXMLドキュメントをインポートできるようになります。
libname permit xmlv2 'C:\My Documents\XML\permit.xml' xmlprocess=permit;
proc print data=permit.chars;
run;
PERMIT.CHARSのPRINTプロシジャ出力