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 のデータ型

隠れた存在ですが、実際には XML および XMLList という新しい 2 つのデータ型があります。ECMAScript の他の多くの型と同じように、これらの型は明示的に宣言する必要はありません。ただし、記述されたコードによっては、これらの型が暗黙的に作成および操作されます。

XML データ型

通常、XML 変数は、前出の myXML 変数などのルートを持つ XML を表します。この変数のルート要素は <employees> 要素(残りの XML が格納される)です。myXML 変数で従業員の 1 人を問い合せても、次の例のように 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 データ型

一方、XMLList 変数は通常はルートのない XML を表します。たとえば、<employees> タグがない場合、myXMLXMLList になります。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 自体の最上位の要素が階層の中でその変数のすぐ下にきます。以下の 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;

関連トピック

. 演算子で要素の子にアクセスする

XML マップからスクリプト関数を使用する