WebViewで表示中のページを解析して文書木が得られたら、もちろん、特定ノードを取り出したくなります。だからといって、DOM APIを使って地道に探索するのはメンドウ。やっぱりXPathでズバッと選択したいところ。
残念ながらAndroidにはXPath式を扱うAPIが見つかりません。ただ、XPath式を処理するためだけにXalanはちょっと重い気がしたので、いろいろなオブジェクトモデルをサポートするjaxenを試してみました。
jaxenはDOMをサポートしているし、AndroidもAPIを提供しているので、すんなり呼び出せるだろうと高をくくっていたのですが…
なぜじゃ。Androidが提供していないAPIを使おうとして例外が出るならともかく、IndexOutOfBoundsExceptionなんて。それも、Node.getNextSibling()で…
いろいろ調べてみたところ、
なんて見つけました。あーあぁ。やむを得ず、jaxenのDocumentNavigator.javaの斜体字部分を修正。
906 public Object next ()
907 {
908 if (node == null) throw new NoSuchElementException();
909 Node ret = node;
910 node = getNextNode(node);
try {
node = getNextNode(node);
} catch (IndexOutOfBoundsException e) {
node = null;
}
911 while (!isXPathNode(node)) {
912 node = getNextNode(node);
913 }
914 return ret;
915 }
ついでに、 XOM、 dom4j、 JDOMのサポートを切り捨ててビルドし、再度、サンプルを実行したら、ようやく期待通り指定ノードを取り出すことができました。
残念ながらAndroidにはXPath式を扱うAPIが見つかりません。ただ、XPath式を処理するためだけにXalanはちょっと重い気がしたので、いろいろなオブジェクトモデルをサポートするjaxenを試してみました。
jaxenはDOMをサポートしているし、AndroidもAPIを提供しているので、すんなり呼び出せるだろうと高をくくっていたのですが…
なぜじゃ。Androidが提供していないAPIを使おうとして例外が出るならともかく、IndexOutOfBoundsExceptionなんて。それも、Node.getNextSibling()で…
いろいろ調べてみたところ、
なんて見つけました。あーあぁ。やむを得ず、jaxenのDocumentNavigator.javaの斜体字部分を修正。
906 public Object next ()
907 {
908 if (node == null) throw new NoSuchElementException();
909 Node ret = node;
910 node = getNextNode(node);
try {
node = getNextNode(node);
} catch (IndexOutOfBoundsException e) {
node = null;
}
911 while (!isXPathNode(node)) {
912 node = getNextNode(node);
913 }
914 return ret;
915 }
ついでに、 XOM、 dom4j、 JDOMのサポートを切り捨ててビルドし、再度、サンプルを実行したら、ようやく期待通り指定ノードを取り出すことができました。