<?xml version="1.0" encoding="UTF-8" ?>
<entry
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja-JP"
>
	<title>Mozilla Java Html Parserを使ってみた</title>
	<id>tag:txqz.net,2008-01-24:blog/2008/01/24/1559</id>
	<link rel="self" href="http://txqz.net/blog/2008/01/24/1559.atom"/>
	<link rel="alternate" type="application/rss+xml" href="http://txqz.net/blog/2008/01/24/1559.rdf"/>
	<link rel="alternate" type="application/xhtml+xml" href="http://txqz.net/blog/2008/01/24/1559.xhtml"/>
	<link rel="alternate" type="text/html" href="http://txqz.net/blog/2008/01/24/1559.html"/>
	<link rel="contents" href="http://txqz.net/blog/2008/01/24/.atom" title="2008年1月24日"/>
	<link rel="first" href="http://txqz.net/blog/2001/08/04/0001.atom" title="地球空冷化"/>
	<link rel="prev" href="http://txqz.net/blog/2008/01/23/0820.atom" title="プロ夜行バス乗車人とニコニコ動画100万IDの実際"/>
	<link rel="next" href="http://txqz.net/blog/2008/01/29/2340.atom" title="名古屋または浜松から東京に行きたい!"/>
	<link rel="last" href="http://txqz.net/blog/2008/12/19/2152.atom" title="浜松市街地を通り抜けて、ムーンライトながら～の思い出"/>
	<author>
		<name>陽坂智佐</name>
		<email>spambasket@txqz.net</email>
	</author>
	<content type="xhtml">
		<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://journal.mycom.co.jp/news/2008/01/22/024/index.html" title="Java Mozilla Html Parser登場、ブラウザと同じクオリティを実現 | エンタープライズ | マイコミジャーナル">マイコミジャーナルで紹介されていた</a>ので<a href="http://mozillaparser.sourceforge.net/" title="Mozilla Java Html Parser">Mozilla Java Html Parser</a>を触ってみたがうまくいかなかった。</p>
<p><a href="http://sourceforge.net/project/showfiles.php?group_id=186646" title="SourceForge.net: Files">Sourceforgeからダウンロード</a>してMozillaHtmlParser.jarおよびlibフォルダに含まれていたJARファイル群をEclipseの「外部アーカイブ」に追加。以下のような簡単なソースを書いた (ていうかMozillaHtmlParser.jarの中に入っていたcom.dappit.Dapper.parser.example.ParserExampleをさらに簡単にしたもの):</p>
<pre><code class="java">import java.io.File;

import org.w3c.dom.Document;

import com.dappit.Dapper.parser.EnviromentController;
import com.dappit.Dapper.parser.MozillaParser;

public class Test {
    public static void main(String[] args) throws Exception {
        File parserLibraryFile = new File("./native/bin/MozillaParser" + EnviromentController.getSharedLibraryExtension());
        String parserLibrary = parserLibraryFile.getAbsolutePath();
        System.out.println("Loading Parser Library :" + parserLibrary);
        final File mozillaDistBinDirectory = new File("mozilla.dist.bin."+EnviromentController.getOperatingSystemName());
        MozillaParser.init(parserLibrary,mozillaDistBinDirectory.getAbsolutePath());        
        
        try {
            MozillaParser parser = new MozillaParser();
            System.out.println("parsing...");
            
            String html = "&lt;html&gt;Test&lt;/html&gt;";
            Document document = parser.parse(html);
            System.out.println("Generated document :" + ((org.dom4j.Document)document).asXML());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("done...");
    }
}</code></pre>
<p>実行させると:</p>
<pre><samp>Operating system : Windows XP
Loading Parser Library :C:\Program Files\MozillaJavaHTMLParser\native\bin\MozillaParser.dll
parsing...
Cannot convert: null into a W3C DOM Node
done...
Initializing XPCOM from location : C:\Program Files\MozillaJavaHTMLParser\mozilla.dist.bin.win...
org.w3c.dom.DOMException: Not supported yet
    at org.dom4j.dom.DOMNodeHelper.notSupported(DOMNodeHelper.java:468)
    at org.dom4j.dom.DOMNodeHelper.asDOMNode(DOMNodeHelper.java:405)
    at org.dom4j.dom.DOMNodeHelper.getParentNode(DOMNodeHelper.java:79)
    at org.dom4j.dom.DOMElement.getParentNode(DOMElement.java:100)
    at com.dappit.Dapper.parser.DomDocumentBuilder.buildDocument(DomDocumentBuilder.java:109)
    at com.dappit.Dapper.parser.MozillaParser.parse(MozillaParser.java:84)
    at Test.main(Test.java:21)
</samp></pre>
<p>DomDocumentBuilder.javaの109行目付近を見ると:</p>
<pre><code class="java">            case ParserInstruction.CloseNode:
            {
                if (currentElement == null)
                {
                    System.err.println("Error : Close Node where no OpenNode was called. trying to fix...");
                    // this.dump();
                }
                else if (closeHtml)
                    currentElement = (Element) currentElement.getParentNode();</code></pre>
<p>変数currentElementはorg.w3c.Elementインターフェイスのインスタンスで、HTML要素の親ノードを取得しようとしたか、またはルートノードの親ノードを取得しようとしてNULLが出たのかなーと思ったが、まさかそんな基本的なところで躓くようなスクリプトが一般に公開されているとも思えないので私のやり方が悪いはず。でも見当がつかない。</p>
<p>Mozilla HTML Parserについて言及しているサイトを調べたが、<a href="http://labs.gmo.jp/blog/ku/2007/03/firefoxhtmlparserxpcomhtml1.html" title="FirefoxのhtmlparserをXPCOM経由で呼び出して壊れたHTMLを修復する - bits and bytes">bits and bytesの紹介記事</a> (直接Cから叩いている) と<a href="http://pc11.2ch.net/test/read.cgi/tech/1200151522/107" title="【初心者】Java質問･相談スレッド111【大歓迎】">プログラム技術板の質問スレ</a> (回答なし) くらいしか見当たらなかった。後者については、たしかに<a href="http://mozillaparser.sourceforge.net/quickstart.html" title="Mozilla Java Html Parser">Quick Start</a>には</p>
<pre><code class="java">Document domDocument = MozillaParser.getInstance().parse("&lt;html&gt;Hello world!&lt;/html&gt;");
MozillaParser.getInstance().stopRunning();</code></pre>
<p>なんて書いてあるからそうコーディングしてしまうけど、ちゃんとExampleファイルを見てみるとフツーにMozillaParserをnewしていたという<span class="face">^^</span> でもここを乗り越えると今私が嵌まっている罠が待っているわけで。誰かえらい人の降臨を待ちたいところ。</p>
<ins class="ps" datetime="2008-06-19T14:25:38+09:00" id="PS1213853138">
<p><a href="http://txqz.net/blog/2008/06/19/1424" title="Mozilla Java Html Parserが動いた">ちゃんとやったら動いた</a>。</p>
</ins>
		</div>
	</content>
	<category term="HTML"/>
	<category term="Java"/>
	<category term="パーサ"/>
	<trackback:ping>http://txqz.net/blog/2008/01/24/1559/tb</trackback:ping>
	<published>2008-01-24T15:59:09+09:00</published>
	<updated>2008-06-19T14:25:38+09:00</updated>
	<rights>Attribution-Noncommercial-Share Alike 3.0 Unported</rights>
</entry>