XSLT:JTidyを使ってXHTMLからデータを取り出す
CyberNeko HTML Parserを使うと上手くいかなかったんですが、JTidyっていうのを使ったら上手くいった。
webryblogの記事から記事タイトルとボディを抜いてみます。
ソース
String xsl = "xsl/webryblog.xsl"; String xml = "xsl/webryblog.xml"; //String out = "xsl/result.xml"; String encoding = "UTF-8"; try { Tidy tidy = new Tidy(); tidy.setQuiet(true); tidy.setInputEncoding(encoding); tidy.setOutputEncoding(encoding); tidy.setShowErrors(0); tidy.setShowWarnings(false); tidy.setForceOutput(true); Document tidyDOM = tidy.parseDOM(new FileInputStream(xml), null); StreamSource tplXsl = new StreamSource(xsl); TransformerFactory trf = TransformerFactory.newInstance(); Transformer xslt = trf.newTransformer(tplXsl); xslt.setOutputProperty("encoding", encoding); xslt.transform(new DOMSource(tidyDOM), new StreamResult(System.out)); } catch(Exception ex) { ex.printStackTrace(); }
XSLファイル
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> Title: <xsl:value-of select="//div[@id='blog-head']/h2"/> Body: <xsl:value-of select="//*[@id='blog-body']"/> </xsl:template> </xsl:stylesheet>
実行結果
Title: (ここに切り出したタイトルが入る) Body: (ここに切り出したタイトルが入る)
というわけで、多分上手くいったので各blogに対応するXSLファイルを作りまくれば色々抜けるかも。