jQueryのDOM制御は強力です。
WSH等、ローカルのバッチを起動した際に、
XMLの解析や変更ができればいろいろと便利です。
いろいろ調べてみると簡単に実装できたので、記事として残しておきます。
jQueryを使えるように準備する
WSHでjQueryを使用できるようにするには、3ステップ必要です。
○事前処理(preUsejQuery.js)
・documentオブジェクトを作成
・windowオブジェクトの代替
・各種関数をラップ
○jQueryの登録(jQuery.js)
XMLの読み込みに関して、Ver.1.4.0 ~ 1.12.4 の動作を確認しています。
○代替変数の登録(postUsejQuery.js)
・jQuery、$オブジェクトの代替
jQueryの登録は、スクリプトの読み込みだけなので説明は省略します。
事前処理
jQueryのバージョンを変更する事も考慮し、この処理だけで一つのスクリプトファイルとします。preUsejQuery.js とでもしましょうか。
(function(){
// documentオブジェクトを作成
document = new ActiveXObject( "htmlfile" );
document.write("<html></html>");
window = document.parentWindow;
location = window.location;
navigator = window.navigator;
window.ActiveXObject = ActiveXObject
// 関数の代替え
alert = function( str ){ return window.alert( str ); };
confirm = function( str ){ return window.confirm( str ); };
setInterval = function( code, interval ){ return window.setInterval( code, interval ); };
clearInterval = function( id ){ window.clearInterval( id ); };
setTimeout = function( code, delay ){ return window.setTimeout( code, delay ); };
clearTimeout = function( id ){ window.clearTimeout( id ); };
// Ver.1.10.2 で発生したエラー対応
document.documentElement.contains = function(e){return document.documentElement.contains(e)}
})();
代替変数の登録
単純に、「jQuery」、「$」という変数が定義されていないので、
呼び出しやすいように定義するだけです。
つまり、必要ない!という方は、このコードは無視してOKです。
jQuery = window.jQuery;
$ = window.$;
WSHでjQueryを使用しXMLを解析する
上記で作成したjsファイル2つで、jQueryファイルを挟んで読み込めば、使用可能となります。
sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<testTag>
<comment>あ</comment>
</testTag>
<testTag>
<comment>い</comment>
</testTag>
<testTag>
<comment>う</comment>
</testTag>
<testTag>
<comment>え</comment>
</testTag>
<testTag>
<comment>お</comment>
</testTag>
</root>
test.wsf
<job>
<script language="JavaScript" src="preUsejQuery.js"></script>
<!--
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script language="JavaScript" src="postUsejQuery.js"></script>
<script language="JavaScript">
// xml読み込み
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("sample.xml");
// xmlをjQueryオブジェクトに
var $xml = $(xml);
alert( $xml.text() );
</script>
</job>
WSHでjQueryを使用しXMLを保存する
今回読み込みを、XMLDOMで読み込んだ事には、意味があります。
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("sample.xml");
通常jQuery関数での読み込みの場合は、文字コードがUTF-8でなくてはいけないこと。
それと、HTML DOMとして作成される為、もちろんセーブ関数が存在しないからです。
$xml.find("comment").text("か");
alert( $xml.text() );
$xml[0].save( "sample_change.xml" );
jQuery Objectは、単純に元のDOMオブジェクト群をラップしているにすぎないので、
var xml = new ActiveXObject("Microsoft.XMLDOM");
の「var xml」には、「load」、「save」関数が存在する為、
その関数を呼び出しただけです。
WSHでjQueryを使用しXMLに新たにDOMを追加する
jQueryであれば、以下のように可能ですが
$xml.find("root")
.append( "<testTag>" );
これでは、saveコマンドが通りません。
それはDOMオブジェクトの種類が違うからです。正しくは、
$xml.find("root")
.append( xml.createElement("testTag") );
とする必要があり、XML DOMオブジェクトとしてappendするわけですね。
今回のsample.xmlで、新規に「<testTag>」を追加しようとした場合は、
// testTag を作成
var $tag = $( xml.createElement("testTag") );
// commentタグを作成し、上記testTagに追加
var $comment = $( xml.createElement("comment") ).appendTo( $tag );
$comment.text( "げ" ); // テキストを書き換える
// 任意の場所にDOMを追加
$xml.find("root").append( $tag );
書き方は、雑ですが、こんな感じですね。
注意すべきは、DOMの生成時に、「createElement」を使用するという事だけです。
これで説明は終了です。