XMLDocument スクリプトオブジェクト

  • リリースバージョン: Zurich
  • 更新日 2025年07月31日
  • 所要時間:7分
  • 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>