XML ドキュメント (文字列) から XML データを解析および抽出するための JavaScript オブジェクトラッパー。

この Javascript クラスを使用して、XML 文字列からオブジェクト (通常は Web サービスの呼び出しからの戻り値)、または ECC キューの XML ペイロードをインスタンス化します。Javascript ビジネスルールで XMLDocument オブジェクトを使用すると、XML 要素と属性から直接、値のクエリを実行できます。

コンストラクター

スクリプトオブジェクトのコンストラクターは、使用するオブジェクトの新しいインスタンスを作成します。
var xmlString = "<test>" +
                "  <one>" +
                "    <two att=\"xxx\">abcd1234</two>" +
                "    <three boo=\"yah\" att=\"yyy\">1234abcd</three>" +
                "    <two>another</two>" +
                "  </one>" +
                "  <number>1234</number>" +
                "</test>";

var xmldoc = new XMLDocument(xmlString);
名前空間で修飾された XML 文字列の XML 解析を実行するには、XMLDocument コンストラクターの 2 番目の引数に「true」を指定します。次の例は、要素の名前空間修飾を含む XML 文字列の解析です。
var xmlString = "<bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>" +
                  "<bk:title>Cheaper by the Dozen</bk:title>" +
                  "<isbn:number>1568491379</isbn:number>" +
                "</bk:book>";

var xmldoc = new XMLDocument(xmlString, true); // XML document is name space aware

ノードと要素の配置

XMLDocument オブジェクトを準備できたので、次の API を呼び出して、XML ドキュメントのノードと要素を検索したり、そこからテキストを直接抽出したりできます。ノードと属性を検索するためのクエリ構文は、XPath に基づいています。
注: このオブジェクトの XML 解析は名前空間を認識しません。つまり、名前空間があるノード名 (たとえば「<names:myelement> ...」など) を検索する場合に、XPath 検索文字列は「//myelement」になります。
XPath でノードを検索し、結果のノードからテキスト値を取得する例を次に示します。
var str = xmldoc.getNodeText("//two"); // returns the first occurrence of the node
// str == "abcd1234"

str = xmldoc.getNodeText("//three");
// str == "1234abcd"

str = xmldoc.getNodeText("/test/one/*");
// str == "abcd1234"

str = xmldoc.getNodeInt("//number");
// str == 1234
次の例では、XPath でノードを検索し、ノードと要素で API を使用して属性と値を取得します。
var node = xmldoc.getNode("/test/one/two");
// node.getNodeName() == "two"
// node.getNodeType() == "1" // 1 == ELEMENT_NODE
// node.getLastChild().getNodeType() == "3" // 3 == TEXT_NODE
// node.getLastChild().getNodeValue() == "abcd1234"
または、次の便利な関数を使用してノード名とタイプを取得することもできます
str = xmldoc.getNodeName("//three");
// str == "three"

str = xmldoc.getNodeType("//three");
// str == "1"
反復できる、または位置により直接アクセスできるノードのリストを取得することもできます
var nodelist = xmldoc.getNodes("//one/*"); // two, three, and two
// nodelist.getLength() == "3"
// nodelist.item(0).getNodeName() == "two"
// nodelist.item(1).getNodeName() == "three"
次の例は、名前空間で修飾された XML 文字列の解析です。
var xmlString = "<bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>" +
                  "<bk:title>Cheaper by the Dozen</bk:title>" +
                  "<isbn:number>1568491379</isbn:number>" +
                "</bk:book>";

var xmldoc = new XMLDocument(xmlString, true);
var str = xmldoc.getNodeText("//bk:title"); // returns the first occurence of the node
gs.log(str);

str = xmldoc.getNodeText("/bk:book/*");
gs.log(str);

str = xmldoc.getNodeInt("//isbn:number");
gs.log(str);

属性値の取得

属性は単なるノードの拡張であるため、まったく同じ API を持ちます。

次の例は、ノードにクエリを実行して、その属性を位置で取得する方法を示しています
node = xmldoc.getNode("//two");
// node.getAttributes().item(0).getNodeValue() == "xxx"

str = xmldoc.getAttribute("//two", "att");
// str == "xxx"
XPath には、属性ノードを直接検索するためのクエリ構文もあります。以下に例を示します。
str = xmldoc.getNodeText("//*[@att=\"yyy\"]");
// str == "1234abcd"

str = xmldoc.getNode("//@boo").getNodeValue();
// str == "yah"

新しい要素の作成

XML ドキュメントが作成されれば、XML ドキュメントのどのレベルでも XML 要素を作成できます。setCurrent 関数を使用して新しい要素を子要素として作成する位置を指定し、createElement 関数を使用して要素を作成します。
var xmlString = "<test>" +
                "  <one>" +
                "    <two att=\"xxx\">abcd1234</two>" +
                "    <three boo=\"yah\" att=\"yyy\">1234abcd</three>" +
                "    <two>another</two>" +
                "  </one>" +
                "  <number>1234</number>" +
                "</test>";

var xmldoc = new XMLDocument(xmlString);
xmldoc.createElement("new", "test"); // creates the new element at the document element level if setCurrent is never called
xmldoc.createElement("new2"); // calling without a value will create a new element by itself

var el = xmldoc.createElement("new3");
xmldoc.setCurrent(el); // this is now the parent of any new elements created subsequently using createElement()
xmldoc.createElement("newChild", "test");
結果の XML ドキュメントは次のようになります
<test>
  <one>
    <two att="xxx">abcd1234</two>
    <three boo="yah" att="yyy">1234abcd</three>
    <two>another</two>
  </one>
  <number>1234</number>
  <new>test<new>
  <new2/>
  <new3>
      <newChild>test</newChild>
  </new3>
</test>