素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

XPathEvaluator

var XPath = {
  cache: null,

  reset: function () {
    this.cache = {__proto__: null};
  },

  get: function (context, expr, type) {
    var cache = this.cache, evaluator;
    if (expr in cache) {
      evaluator = cache[expr];
    } else {
      evaluator = cache[expr] = XPathEvaluator().createExpression(expr, null);
    }
    return evaluator.evaluate(context, type, null);
  },

  has: function (context, expr) {
    return this.get(context, expr, XPathResult.BOOLEAN_TYPE).booleanValue;
  },

  first: function (context, expr) {
    return this.get(context, expr, XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue;
  },

  last: function (context, expr) {
    var all = this.get(context, expr, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
    return all.snapshotItem(all.snapshotLength - 1) || null;
  },

  all: function (context, expr) {
    var all = this.get(context, expr, XPathResult.ORDERED_NODE_ITERAATE_TYPE);
    var ret = [];
    for (var i; (i = all.iterateNext()) !== null;) {
      ret.push(i);
    }
    return ret;
  }
};

XPath.reset();