文字列のHTMLに対してXPathを使う

XHRで取ってきた文字列としてのHTMLに対して、XPath使ってデータを取るのがなんとかできた。
Firefox以外では動かないと思うけど、今回はGreasemonkey用なので気にしない。

  1. document.implementation.createDocumentを使ってDocumentをつくる
  2. RangeのcreateContextualFragmentを使ってDocumentFragmentをつくる
  3. 最初に作ったDocumentにDocumentFragmentを付ける
  4. そのDocumentに対してXPathを使う

まだ雑だけど、そのへんのコードはこんな感じ。

    function load(data) {
        var v = data.responseText.replace(/<html.*?>/, '')
        v = v.replace(/<\/html>/, '')
        var ns = 'http://www.w3.org/1999/xhtml'
        var doc = document.implementation.createDocument(ns, 'html', null)
        var html = doc.documentElement
        var body = doc.createElementNS(ns, 'body')
        html.appendChild(body)
        var range = document.createRange()
        range.setStartAfter(document.body)
        var df = range.createContextualFragment(v)
        body.appendChild(df)
        request_url = get_first_by_xpath(config.next_xpath, doc).href
        var page = get_first_by_xpath(config.page_xpath, doc)
        var hr = doc.createElementNS(ns, 'hr')
        var p = doc.createElementNS(ns, 'p')
        p.appendChild(doc.createTextNode('page: ' + ++page_num))
        insert_elem.parentNode.insertBefore(hr, insert_elem)
        insert_elem.parentNode.insertBefore(p, insert_elem)
        insert_elem.parentNode.insertBefore(page, insert_elem)
        busy(false)
    }

でも少しルートのへんがおかしくて、/htmlとか/html/bodyとかがうまくマッチしないんだけど、
とりあえず疲れたのでこのへんにしとく。

ということで、これをつかったバージョンにアップデートしました。
AutoPagerize for Google
http://swdyh.yu.to/autopagerizeforgoogle.user.js


参考 新しく作成したXML文書でDOM HTMLを使う
http://www.akatsukinishisu.net/itazuragaki/xml/use_dom_html_in_xml.html