XML マップとスクリプトに関する考慮事項
XML マップを使用するときには、マッピングに使用する XML マップと ECMAScript の特殊な動作に関する以下の事項に注意してください。
XML は、要素や属性などのネーミングに非常に柔軟に対応します。その結果、スクリプトで処理する XML の名前が、ECMAScript のキーワードまたは XML で使用するように提供された関数と同じになることもあります。要素の名前が ECMAScript キーワードまたは関数名と衝突する場合は、代わりに次の構文を使用できます。ECMAScript キーワード用と関数名用の 2 通りの解決策があります。
/* * Return all of the <if> elements. * This avoids a conflict with the "if" ECMAScript keyword. */ var ifs = xmlData.product_description["if"]; /* * Return the first <parent> element. * This avoids a conflict with the parent function. */ var firstParent = xmlFamilies.kid.::parent[0];
Workshop の拡張 ECMAScript に含まれる XML 関連のデータ型を使用すると、XML フラグメントを XML 変数に割り当てることができます。ただし、フラグメントは次の例のように <> と </> で表された匿名の要素で囲む必要があります。
var myXMLList = <> <firstname>John</firstname> <lastname>Walton</lastname> <age>25</age> <>
関数参照(中括弧とその間のすべて)は、その親要素の唯一の子でなければなりません。たとえば、次の部分的な XML マップではエラーが生じます。
<placeOrder xmlns="http://www.openuri.org/">
{CustomerServices.OrderScripts.convertOrder(currentOrder, currentCustomer)}
<customer_info>{currentCustomer}</customer_info>
</placeOrder>
ただし、次の場合は問題なく機能します。
<placeOrder xmlns="http://www.openuri.org/">
<order_info>
{CustomerServices.OrderScripts.convertOrder(currentOrder, currentCustomer)}
</order_info>
<customer_id>{currentCustomer.custID}</customer_id>
</placeOrder>
詳細については、Web サービスからスクリプトを使用するにはを参照してください。
リテラル テキスト(XML 要素または属性の名前の一部ではなく、マッピング タグおよび属性の一部でもないテキスト)は、特定の状況でのみ XML マップで使用できます。たとえば次の例のように、リテラル テキストを置換ディレクティブ(xm タグ内のテキストまたは中括弧内のテキスト)と結合することはできません。
<!-- not a legal xml map --> <item> <description> bad text {d} bad text </description> bad text <quantity units="bad text {u} bad text"> bad text {q} bad text </quantity> bad text </item>
ただし、次の例は有効です。
/** * @jws:parameter-xml xml-map="xml":: * <searchData> * <query> * <criterion> * <vendorName>Legal Text</vendorName> * <partName><xm:value obj="criterionValue"/></partName> * </criterion> * </query> * </searchData> * :: */ public String searchData(String criterionName, String criterionValue) {...}
XML マップをメソッドまたはコールバックに適用すると、そのサービスの(たとえば WSDL で表現される)インタフェースが変化します。インタフェースは、マップを通じて提示されたときにデータを反映します。事実上、マップは基の Java コードを「隠蔽」します。
たとえば、内部クラスをパラメータの 1 つとして送信するコールバックがあるとします。そのコールバックの XML マップがあり、たとえば内部クラスのデータ メンバーが XML 要素に解析されるような場合、内部クラス自体はクライアントからは見えません。サービスの WSDL からサービス コントロールを生成する場合、そのコントロールは「AnonType_」が先頭に付けられた内部クラスのある種の匿名代替物を宣言します。そのコントロールを使用するクライアント Web サービスの側では、コントロール名をパッケージ名として渡してこのクラスをインポートしなければなりません。import 文の追加は、コントロールをクライアント Web サービスに追加したときに WebLogic Workshop によって処理されます。
JWS ファイル内のクラスと同じように、XML マップのルート タグは JWS ファイル内でユニークでなければなりません。その理由は、それらがコンパイル時にそれらをサポートする型の個別のクラスになるからです。たとえば以下の 2 つの XML マップでは、<searchRequest> タグと <SearchRequest> タグがルート タグとなります。この場合、片方をサポートするために必要な CLASS ファイルがもう片方をサポートするために必要なファイルを上書きする結果になります。
/** * This code will not work as expected! The <searchRequest> tags create a situation * in which one map will work while types to support the other are overwritten. * * @jws:operation * @jws:parameter-xml xml-map:: * <searchRequest xmlns="http://www.openuri.org/"> * <productName serialNumber="{serialNumber}">{productName}</productName> * <quantity>{quantity}</quantity> * </searchRequest> * * :: * @jws:return-xml xml-map:: * <SearchRequest xmlns="http://www.openuri.org/"> * <return>{return}</return> * </SearchRequest> * * :: */
注意: Windows 搭載コンピュータを使用している場合は、大文字と小文字の区別を考慮する必要があります。Windows のファイル システムでは大文字と小文字が区別されないので、searchRequest.class という名前のクラスが SearchRequest.class という名前のクラスを上書きします。
JWS ファイル内のすべてのクラスおよび XML マップ ルート タグの名前を列挙し、それらがユニークであることを確認するようにしてください。