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が来てしまうなどの問題も見られた。