txqz memo

Mozilla Java Html Parserが動いた

5ヶ月前から放置していたMozilla Java Html Parserだが、さっき入れなおしてみたら動いた。前回はMozillaHtmlParser.jarの中に入っていたcom.dappit.Dapper.parser.example.ParserExampleを参考にしたが、今回はQuick Startを参考にした、というかinitメソッドに渡す値が変だったのでそれを直せばよかったみたい。Quick Startに書いてあるとおりに、C:\Program Files\MozillaHtmlParser\mozilla.dist.bin.winとかを環境変数のPATHに加えたのだが、ソースにもその文字列をまた書くことになってしまった。多分もっと頭の良い方法があるのでそのうち調べる。

ソースは以下のとおり:

import java.io.File;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import com.dappit.Dapper.parser.EnviromentController;
import com.dappit.Dapper.parser.MozillaParser;

public class MJHP {
    public static void main(String[] args) throws Exception {
        File parserLibraryFile = new File("C:\\\\Program Files\\\\MozillaHtmlParser\\\\native\\\\bin\\\\MozillaParser" + EnviromentController.getSharedLibraryExtension()); 
        String parseLibrary = parserLibraryFile.getAbsolutePath(); 
        MozillaParser.init(parseLibrary, "C:\\\\Program Files\\\\MozillaHtmlParser\\\\mozilla.dist.bin.win"); 
        MozillaParser parser = new MozillaParser();
        Document document = parser.parse("<html>Hello world!</html>");
        System.out.println(dom2string((Node)document.getDocumentElement()));
    }
    public static String dom2string(Node n) {
        StringBuilder buf = new StringBuilder();
        switch(n.getNodeType()) {
        case Node.TEXT_NODE :
            return n.getNodeValue();
        case Node.ELEMENT_NODE :
            buf.append(String.format("<%s", n.getNodeName()));
            NamedNodeMap attrs = n.getAttributes();
            for(int i = 0; i < attrs.getLength(); i++) {
                Node attr = attrs.item(i);
                buf.append(String.format(" %s=\\"%s\\"", attr.getNodeName(), attr.getNodeValue()));
            }
            buf.append(">");
            for(Node child = n.getFirstChild(); child != null; child = child.getNextSibling()) {
                buf.append(dom2string(child));
            }
            buf.append(String.format("</%s>", n.getNodeName()));
        }
        return buf.toString();
    }
}

実行させると、以下のような出力を得られる:

Operating system : Windows XP
<html><body>Hello world!</body></html>;
Initializing XPCOM from location : C:\\Program Files\\MozillaHtmlParser\\mozilla.dist.bin.win...

ひどいHTML特集にMozilla Java Html Parser編を加えた。table直下にtbodyを補完するHTMLパーサは今のところこれだけ。その一方tr直下にtrが来てしまうなどの問題も見られた。