一定文字数以上のテキストノードを取得する

body以下の6文字以上のテキストノードだけ取得したいというケースがあって、XPathでけっこう簡単にできた。

var xpath = '//text()[string-length(normalize-space()) > 5 and not(ancestor::script)]';
var resultType = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE;
var nodes = document.evaluate(xpath, document.body, null, resultType, null);
var strs = [];
for (var i = 0, l = nodes.snapshotLength; i < l; i++) {
    strs.push(nodes.snapshotItem(i).nodeValue);
}
  • text()でテキストノードの取得
  • normalize-space()で空白を取り除く
  • string-length() > 5 で6文字以上のテキスト(日本語も正常に動いた)
  • script要素内も含まれるのでnot(ancestor::script)でscript要素を除外

とかしてる。ちなみにresultTypeは4〜7でベンチとってみたけど大差なかった。イテレータよりスナップショットのほうがやや早い程度。