http://blogs.wankuma.com/pinzolo/archive/2007/11/09/107109.aspx
リクエストいただきましたので、EmEditor 上で XML を整形するマクロです。
要するに、機械が吐き出す読みづらい XML に改行とインデントを追加します。
自分用なので、あまりキッチリ作ってませんが・・・
1 /*
2 * XML をフォーマットします。
3 */
4 // フォーマット後の文字列バッファ
5 var _buff = "";
6
7 // インデント階層
8 var _indentLevel = 0;
9
10 // テキストノードが追加されたかどうか
11 var _isTextAppend = false;
12
13 // インデントに使用する文字列
14 var _indent = "\t"
15
16 // 改行文字
17 var _newLine = "\r\n";
18
19 // 内部使用関数宣言
20 /*
21 * 指定のノードの XML をフォーマットしてバッファに追加します。
22 */
23 function formatNode(node) {
24 if (node.nodeType == 1) { // ELEMENT ノード
25 _buff += _newLine;
26 // インデントを追加
27 for (var ti = 0; ti < _indentLevel; ti++) {
28 _buff += _indent;
29 }
30 // 開始タグを追加
31 _buff += node.xml.substring(0, node.xml.indexOf(">") + 1);
32 _isTextAppend = false;
33
34 // 子ノードがあれば、全子ノードに対して再起処理を行う
35 if (node.childNodes.length > 0) {
36 // インデントレベルをインクリメント
37 _indentLevel++;
38 for (var ci = 0; ci < node.childNodes.length; ci++) {
39 // 各子要素について再起処理
40 formatNode(node.childNodes.item(ci));
41 }
42 // インデントレベルをデクリメント
43 _indentLevel--;
44
45 // テキストノードの直後は改行もインデントも追加しない
46 if (! _isTextAppend) {
47 _buff += _newLine;
48 for (var ti = 0; ti < _indentLevel; ti++) {
49 _buff += _indent;
50 }
51 }
52
53 // 終了タグ
54 _buff += "</" + node.nodeName + ">";
55 _isTextAppend = false;
56 } else if (! _buff.substring(0, _buff.length - 2) == "/>") {
57 // 終了タグのある空要素の場合
58 _buff += "</" + node.nodeName + ">";
59 _isTextAppend = false;
60 }
61 } else if (node.nodeType == 3) { // TEXT ノード
62 // テキストノードはそのまま追加
63 _buff += node.nodeValue;
64 _isTextAppend = true;
65 } else {
66 // その他のノードはインデントしてそのまま追加
67 _buff += _newLine;
68 // タブを追加
69 for (var i = 0; i < _indentLevel; i++) {
70 _buff += _indent;
71 }
72 _buff += node.xml;
73 _isTextAppend = false;
74 }
75 }
76
77 var xdoc = new ActiveXObject("Microsoft.XMLDOM");
78 // XPath が使用できるように
79 xdoc.setProperty("SelectionLanguage", "XPath");
80 xdoc.async = false;
81
82 var activeDoc = editor.activeDocument;
83 activeDoc.selection.selectAll();
84 var xmlText = activeDoc.selection.text;
85
86 try {
87 xdoc.loadXML(xmlText);
88 } catch (e) {
89 alert(e.description);
90 }
91
92 var root = xdoc.documentElement;
93 // XML 宣言などルート要素以前の要素を追加
94 _buff += xmlText.substring(0, xmlText.indexOf("<" + root.nodeName));
95
96 // フォーマット後の XML を作成
97 formatNode(root);
98 activeDoc.selection.text = _buff;