Java 是否有用于查询HTML表的SQL包装器
关于如何将SQL查询的结果格式化为HTML表有很多问题,但我想换一种方式——给定一个带有标题行的任意HTML表,我希望能够使用SQL(或类似SQL的语言)从一行或多行中提取信息。陈述起来很简单,但完成起来显然不那么简单Java 是否有用于查询HTML表的SQL包装器,java,c++,sql,html-parsing,Java,C++,Sql,Html Parsing,关于如何将SQL查询的结果格式化为HTML表有很多问题,但我想换一种方式——给定一个带有标题行的任意HTML表,我希望能够使用SQL(或类似SQL的语言)从一行或多行中提取信息。陈述起来很简单,但完成起来显然不那么简单 最后,我更愿意使用libtidy或JSoup之类的工具正确解析HTML,但是尽管API文档通常是合理的,但当涉及到实际使用它们的示例或教程时,您通常会发现一个提取标记的示例(可以通过正则表达式完成)没有关于如何使用图书馆的真实例子。因此,对于现有的已建立的库之一,一个好的资源或示
最后,我更愿意使用libtidy或JSoup之类的工具正确解析HTML,但是尽管API文档通常是合理的,但当涉及到实际使用它们的示例或教程时,您通常会发现一个提取标记的示例(可以通过正则表达式完成)没有关于如何使用图书馆的真实例子。因此,对于现有的已建立的库之一,一个好的资源或示例代码也很好。使用以下代码将表转换为元组列表的简单代码如下所示:
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;
}
}
公共类主{
公共静态void main(字符串[]args)引发异常{
最终字符串html=
"" +
"" +
“约翰多”+
“迈克尔史密斯”+
"" +
"";
最终列表元组=解析(html,“示例”);
//…这里解析表
}
私有静态最终列表解析(最终字符串html、最终字符串tableId){
最终列表元组=新的LinkedList();
最终元素table=Jsoup.parse(html).getElementById(tableId);
最终元素行=table.getElementsByTag(“tr”);
用于(最终元素行:行){
final-Elements-children=row.children();
final int childCount=childs.size();
最终元组Tuple=新元组(childCount);
for(最终元素子元素:子元素){
tuple.addColumn(child.text());
}
}
返回元组;
}
}
公共最终类元组{
私有最终字符串[]列;
私有int游标;
公共元组(最终整数大小){
列=新字符串[大小];
光标=0;
}
公共字符串getColumn(最终整数编号){
返回列[否];
}
公共void addColumn(最终字符串值){
列[cursor++]=值;
}
}
从这一点开始,您可以使用常规SQL创建内存中的表。由于大多数html解析器都提供了一个树,您可能会更幸运地使用XQuery/XPath或XSLT之类的工具。