XML 変数を作成および使用する
WebLogic Workshop に付属の ECMAScript の拡張機能を使用すると、XML を処理するための変数を次のように簡単に作成できます。
var myXML = <employees> <employee id="111111111"> <firstname>John</firstname> <lastname>Walton</lastname> <age>25</age> </employee> <employee id="222222222"> <firstname>Sue</firstname> <lastname>Day</lastname> <age>32</age> </employee> </employees>;
変数を作成して記号 < で始まる値を割り当てると、その値は自動的に XML として解釈されます。
つまり、XML パーサのインスタンスを作成したり、Document Object Model(DOM)に準拠したドキュメント インスタンスを作成したりする必要はありません。他の XML プログラミング モデルに共通のそのような余分なステップは必要ありません。代わりに、(上図のように)リテラルの XML 値を割り当てるか、次のように new 演算子を使用して XML 変数を作成して変数を作成します。
var myXMLVariable = new XML("<employee id='111111111'><firstname>John</firstname></employee>");
XML の格納された変数を使用すると、コレクションや配列のような階層データまたはリスト データが含まれる他の型の場合と同じように XML にアクセスして操作できます。たとえば、次のコードでは myXML 変数を使用して John の名前を Roger に変更します。
/* Change the <firstname> value of the first employee to Roger. */ myXML.employees.employee[0].firstname = "Roger";
隠れた存在ですが、実際には XML および XMLList という新しい 2 つのデータ型があります。ECMAScript の他の多くの型と同じように、これらの型は明示的に宣言する必要はありません。ただし、記述されたコードによっては、これらの型が暗黙的に作成および操作されます。
通常、XML 変数は、前出の myXML 変数などのルートを持つ XML を表します。この変数のルート要素は <employees> 要素(残りの XML が格納される)です。
/* Create an XML variable from the first employee element. */ var anEmployee = myXML.employees.employee[0];
クエリ結果の anEmployee 変数の内容は次のようになります。
<employee id="111111111"> <firstname>John</firstname> <lastname>Walton</lastname> <age>25</age> </employee>
一方、XMLList 変数は通常はルートのない XML を表します。たとえば、<employees> タグがない場合、myXML は XMLList になります。XMLList 変数を作成する場合は、次のように行うことができます。
var myXMLList = <> <employee id="111111111"> <firstname>John</firstname> <lastname>Walton</lastname> <age>25</age> </employee> <employee id="222222222"> <firstname>Sue</firstname> <lastname>Day</lastname> <age>32</age> </employee> </>;
ここで変数に割り当てられた値には実際のルートはありませんが、<> と </> で表された anonymous ルートがあります。実際のルートはないので、myXMLList の XML は XML フラグメントと呼ばれます。
クエリで XML 型が返されるように、XML の特定の断片に対するクエリでも XMLList が返されます。<employee> のインデックス番号を指定しないと、次のコード行ではすべての <employee> 要素が返されます。
var listOfEmployees = myXML.employees.employee;
クエリ結果の XML は次のようになります(全体を囲む要素がないことに注意)。
<employee id="111111111"> <firstname>John</firstname> <lastname>Walton</lastname> <age>25</age> </employee> <employee id="222222222"> <firstname>Sue</firstname> <lastname>Day</lastname> <age>32</age> </employee>
XMLList 型の最も便利な側面の 1 つは、その内容に反復的にアクセスできることです。XMLList 型は、.(ドット)演算子を使用して XML の特定部分のクエリを実行するときに返されます。たとえば、最初の例で myXML 変数を使用すると、次のようなコードを記述できます。
/* Create an XMLList containing the <employee> elements. */ var listOfEmployees = myXML.employees.employee; for (var e in listOfEmployees) { // Create a new variable with the content of the <age> element converted to a number. var age = new Number(e.age); // Raise everyone's age by 1 year. age += 1; // Assign the new age value to the content of the element. e.age = age; }
変数名は XML のルートではなく XML のコンテナに対応する
変数を通して XML にアクセスする場合は、その XML 自体の最上位の要素が階層の中でその変数のすぐ下にきます。以下の 2 行のコードを比較してみてください。
/* This is how it's done! */ var johnFirstName = myXML.employees.employee.firstname; /* This won't return the correct result! */ var johnFirstName = myXML.employee.firstname;
スクリプトのインタプリタは PI とコメントを読み込むが、それらは XML 値に保持されない(暗黙的に無視される)
スクリプトのインタプリタは要素の含まれていないリテラルの XML 値をサポートしない