2

关于如何将 SQL 查询的结果格式化为 HTML 表有很多问题,但我想换一种方式 - 给定一个带有标题行的任意 HTML 表,我希望能够提取信息使用 SQL(或类似 SQL 的语言)形成一个或多个行。说起来很简单,但显然实现起来并不那么简单。

最终,我更喜欢使用 libtidy 或 JSoup 之类的东西正确解析 HTML,但是虽然 API 文档通常是合理的,但当涉及到实际使用它们的示例或教程时,您通常会找到一个提取 <title> 的示例标签(可以使用正则表达式完成),没有关于如何使用该库的真实示例。因此,为现有的已建立库之一提供一个好的资源或示例代码也很好。

4

1 回答 1

1

使用JSoup将表转换为元组列表的简单代码如下所示:

public class Main {
    public static void main(String[] args) throws Exception {
        final String html = 
            "<html><head/><body>" +
                "<table id=\"example\">" +
                    "<tr><td>John</td><td>Doe</td></tr>" +
                    "<tr><td>Michael</td><td>Smith</td>" +
                "</table>" +
            "</body></html>";

        final List<Tuple> tuples = parse (html, "example");
                    //... Here the table is parsed
    }

    private static final List<Tuple> parse(final String html, final String tableId) {
        final List<Tuple> tuples = new LinkedList<Tuple> ();

        final Element table = Jsoup.parse (html).getElementById(tableId);
        final Elements rows = table.getElementsByTag("tr");
        for (final Element row : rows) {
            final Elements children = row.children();
            final int childCount = children.size(); 
            final Tuple tuple = new Tuple (childCount);
            for (final Element child : children) {
                tuple.addColumn (child.text ());
            }
        }

        return tuples;
    }
}

public final class Tuple {
    private final String[] columns;

    private int cursor;

    public Tuple (final int size) {
        columns = new String[size];
        cursor = 0;
    }

    public String getColumn (final int no) {
        return columns[no];
    }

    public void addColumn(final String value) {
        columns[cursor++] = value;
    }
}

从这里开始,您可以例如使用H2创建一个内存表并使用常规 SQL。

于 2012-11-19T00:06:27.357 回答