Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有用于查询HTML表的SQL包装器_Java_C++_Sql_Html Parsing - Fatal编程技术网

Java 是否有用于查询HTML表的SQL包装器

Java 是否有用于查询HTML表的SQL包装器,java,c++,sql,html-parsing,Java,C++,Sql,Html Parsing,关于如何将SQL查询的结果格式化为HTML表有很多问题,但我想换一种方式——给定一个带有标题行的任意HTML表,我希望能够使用SQL(或类似SQL的语言)从一行或多行中提取信息。陈述起来很简单,但完成起来显然不那么简单 最后,我更愿意使用libtidy或JSoup之类的工具正确解析HTML,但是尽管API文档通常是合理的,但当涉及到实际使用它们的示例或教程时,您通常会发现一个提取标记的示例(可以通过正则表达式完成)没有关于如何使用图书馆的真实例子。因此,对于现有的已建立的库之一,一个好的资源或示

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


最后,我更愿意使用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之类的工具。