top / index / prev / next / target / source

2017-10-04 diary: [Java][Thymeleaf] attoparser による HTML/XML 読み書きシンプルサンプル

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

[Java][Thymeleaf] attoparser による HTML/XML 読み書きシンプルサンプル

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 $

登場キーワード


この日記について