LoginSignup
12
13

More than 5 years have passed since last update.

JScriptでDOM(XML)操作

Posted at

はじめに

かつては、テキストの汎用フォーマットといえばXMLでしたが
最近はJSONで良いのでは、という所が多くなってきている気がします。

忘れない為のサンプルコードです。

構文解析

「Msxml2.DOMDocument」オブジェクトから、load又はloadXMLメソッドでDOM化出来ます。

ノードの取り方は、XPath形式selectSingleNodeや、タグ名getElementsByTagNameなどで取得出来ます。

// XML
var xml = "<?xml version='1.0'?>\r\n"
        + "<root>\r\n"
        + "    <aaa attr='rtta'>111</aaa>\r\n"
        + "    <bbb>\r\n"
        + "        <ccc>222</ccc>\r\n"
        + "    </bbb>\r\n"
        + "    <bbb>\r\n"
        + "        <ccc>333</ccc>\r\n"
        + "    </bbb>\r\n"
        + "</root>\r\n";

// DOMオブジェクト生成
var dom = new ActiveXObject("Msxml2.DOMDocument");
// 同期化
dom.async = false;
// パース
dom.loadXML(xml);
// ファイルの場合
// dom.load(path);
// 結果判定
if (dom.parseError.errorCode == 0) {
    // XML出力
    WScript.Echo(dom.xml);

    // aaaタグ取得
    var aaa = dom.selectSingleNode("//root/aaa");
    // 属性値取得
    WScript.Echo(aaa.getAttribute("attr"));

    // ルート取得
    var root = dom.documentElement;
    // タグ名がbbbのエレメント取得
    var elements = root.getElementsByTagName("bbb");
    // エレメント数分ループ
    for (var i = 0; i < elements.length; i++) {
        // エレメント取得
        var element = elements[i];
        // 子取得
        var child = element.firstChild;
        // このタグ名とテキスト表示
        WScript.Echo(child.nodeName + ":" + child.text);
    }
} else {
    // パース失敗の場合
    WScript.Echo("parseError:" + dom.parseError.errorCode);
}

生成

「Msxml2.DOMDocument」オブジェクトから、XML宣言createProcessingInstructionやノードcreateElementを生成し階層のとおりに、追加appendChildしていきます。

// DOMオブジェクト生成
var dom = new ActiveXObject("Msxml2.DOMDocument");
// XML宣言部分生成
var head = dom.createProcessingInstruction("xml", "version='1.0'");
// XML宣言部分設定
dom.appendChild(head);

// ルート生成
var root = dom.createElement("root");

// aaaタグ生成
var aaa = dom.createElement("aaa");
// aaaタグ属性設定
aaa.setAttribute("attr", "rtta");
// aaaタグテキスト設定
aaa.text = "111";
// aaaタグをルートに追加
root.appendChild(aaa);

// アイテム数分ループ
var items = ["222", "333"];
for (var i = 0; i < items.length; i++) {
    // bbbタグ生成
    var bbb = dom.createElement("bbb");
    // cccタグ生成
    var ccc = dom.createElement("ccc");
    // cccタグテキスト設定
    ccc.text = items[i];
    // bbbタグにcccタグを追加
    bbb.appendChild(ccc);
    // bbbタグをルートに追加
    root.appendChild(bbb);
}

// DOMにrootを追加
dom.appendChild(root);
12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13