top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
attoparser という HTML/XML 処理系のシンプルサンプルをメモします。 このパーサー、大変気に入りました。私の中の定番 HTML/XML処理系に定着する予感がします。
pom.xml
の依存性を追加します。
<dependency>
<groupId>org.attoparser</groupId>
<artifactId>attoparser</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.unbescape</groupId>
<artifactId>unbescape</artifactId>
<version>1.1.5.RELEASE</version>
</dependency>
駆動する Java コードは以下の通りです。API がすっきりしており、とても使いやすいです。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.List;
import org.attoparser.ParseException;
import org.attoparser.config.ParseConfiguration;
import org.attoparser.dom.Comment;
import org.attoparser.dom.DOMMarkupParser;
import org.attoparser.dom.DOMWriter;
import org.attoparser.dom.Document;
import org.attoparser.dom.Element;
import org.attoparser.dom.IDOMMarkupParser;
import org.attoparser.dom.INode;
import org.attoparser.dom.Text;
import org.unbescape.html.HtmlEscape;
public class SimpleAttoSample {
public static void main(final String[] args) throws IOException {
new SimpleAttoSample().process();
}
public void process() throws IOException {
Document document = null;
try {
final IDOMMarkupParser parser = new DOMMarkupParser(ParseConfiguration.htmlConfiguration());
document = parser
.parse(new BufferedReader(new InputStreamReader(new FileInputStream("index.html"), "UTF-8")));
} catch (ParseException ex) {
throw new IOException("Fail to parse file: " + ex.getMessage(), ex);
}
traverseChildren(document.getChildren());
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("index-modified.html"), "UTF-8"))) {
DOMWriter.writeDocument(document, writer);
}
}
public void traverseChildren(final List<INode> children) {
for (INode node : children) {
if (node instanceof Element) {
final Element element = (Element) node;
System.err.println("element: <" + element.getElementName() + " ...>");
traverseChildren(element.getChildren());
} else if (node instanceof Text) {
final Text text = (Text) node;
System.err.println("text: " + HtmlEscape.unescapeHtml(text.getContent().trim()));
} else if (node instanceof Comment) {
final Comment comment = (Comment) node;
System.err.println("comment: " + comment.getContent());
}
}
}
}
Thymeleaf が内部的に利用していることをきっかけに、このパーサーにたどり着きました。
Last modified: $Date: 2017-10-04 $