Java 构建HTML表表示的算法

Java 构建HTML表表示的算法,java,algorithm,html-table,Java,Algorithm,Html Table,我需要解析一个包含colspan和rowspans的HTML表,并构建它的表示 阅读HTML不是问题,我正在使用HTMLCleaner和XQuery与Saxon(Java)结合使用 但我正在寻找一个好的算法来构建表,因为我不了解浏览器在“困难”情况下遵循的规则 例如,给定下表(其中行跨度错误) i、 e.(e是一个空单元格) 必须删除第3行(Firefox只渲染两行),我怎么知道呢 我特别感兴趣的是不完整行的元素与以下元素一起完成的情况,例如: <tr><td>1<

我需要解析一个包含colspan和rowspans的HTML表,并构建它的表示

阅读HTML不是问题,我正在使用HTMLCleaner和XQuery与Saxon(Java)结合使用

但我正在寻找一个好的算法来构建表,因为我不了解浏览器在“困难”情况下遵循的规则

例如,给定下表(其中行跨度错误)

i、 e.(e是一个空单元格)

必须删除第3行(Firefox只渲染两行),我怎么知道呢

我特别感兴趣的是不完整行的元素与以下元素一起完成的情况,例如:

<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td></tr>
<tr><td>6</td></tr>

rendering: 1 2 3 
           4 5 6
123
45
6.
渲染:1 2 3
4 5 6
我有一个实际案例:包含两个TR,即使它们是两个不同的TR,也被渲染为一个TR。为什么

这些行是(从第129792行开始)

它们渲染为(在红色矩形内)

如何决定将元素排到前一行?

浏览器对奇怪的代码遵循什么规则?

我使用Java,我也了解javascript和一点PHP,但我主要对下面的算法感兴趣。我想知道是否有什么已经存在,或者听听任何建议

我想要的是能够输出表的文本表示,就像真实浏览器呈现的一样

编辑:

在我阅读了xtratic答案之后,我阅读了,但它似乎没有回答我关于何时必须将元素排到前一行的问题,正如我描述的实际情况(并在本编辑中添加的)。事实上,文档中说“16如果当前单元格是正在处理的tr元素中的最后一个td或th元素子元素,则将ycurrent增加1,中止这组步骤,并返回到上面的算法。”。但是,当最后一个td被发现时,我们并不总是去一条新的线路

我更感兴趣的是何时合并不同的行。当前一行的TDs数量小于已找到的最大值时,我尝试将TDs排在前一行的TDs之后,但它不起作用。

阅读了解有关如何处理HTML表的所有需要知道的内容。(这不容易)

由于您希望解析html表的形式,我建议您完全按照下列出的步骤编写处理器(步骤18进入处理行)。我很确定浏览器也是这样做的。这些步骤是以一种尽可能方便的方式编写的,以便将其翻译成处理器的代码,因此您应该能够按照字面意思进行操作。处理器完成后,您应该有一个单元格表(正如定义的那样),然后您可以对现有的表模型执行任何操作。我不能保证这会很容易,但至少你会有一个循序渐进的指南


要特别清楚:没有“合并行”,但有跨多行的单元格。

GENERALI SPA..
放在所有这些行的开头,并将来自以下
元素的数据添加到各自行的下一个可用单元格中

GENERALI SPA…
跨越4行,但它的第一行是隐藏的,因为上面没有其他数据,所以看起来它只覆盖了3行


通用水疗中心#1
通用水疗中心2号
Proprieta'
总计1
总计2
没有格式化或隐藏的表如下所示:

   1                      2                     3             4
  +----------------------+---------------------+-------------+---
1 |         ...          |      (implied)         (implied)       <-- 0px high (hidden)
  +-                    -+---------------------+-------------+---
2 | "GENERALI SPA #1"    | "GENERALI SPA #2"   | "Proprieta" | ..
  +-                    -+-                   -+-------------+---
3 |         ...          |         ...         | "Totale #1" | ..
  +-                    -+---------------------+-------------+---
4 |         ...          | "Totale #2"               ...     | ..
  +----------------------+---------------------+-------------+---
由于单元格“2”跨越第一行和第二行,第二行的定义将考虑它。因此,第二行中的第二个TD实际上定义了该行的第三个单元格。从视觉上看,该表可能会呈现给tty设备,如下所示:

请注意,如果省略了定义TD的单元格“6”,则用户代理将添加一个额外的空单元格以完成该行。

这列出了一些可以帮助你清理表格的库,但我不相信这个答案能解决“困难”的问题案例,因为它假设
元素的出现与表中的单元格索引完全对应。

阅读以了解有关如何处理HTML表的所有必要知识。(这不容易)

由于您希望解析html表的形式,我建议您完全按照下列出的步骤编写处理器(步骤18进入处理行)。我很确定浏览器也是这样做的。这些步骤是以一种尽可能方便的方式编写的,以便将其翻译成处理器的代码,因此您应该能够按照字面意思进行操作。处理器完成后,您应该有一个单元格表(正如定义的那样),然后您可以对现有的表模型执行任何操作。我不能保证这会很容易,但至少你会有一个循序渐进的指南


要特别清楚:没有“合并行”,但有跨多行的单元格。

GENERALI SPA..
放在所有这些行的开头,并将来自以下
元素的数据添加到各自行的下一个可用单元格中

GENERALI SPA…
跨越4行,但它的第一行是隐藏的,因为上面没有其他数据,所以看起来它只覆盖了3行


通用水疗中心#1
通用水疗中心2号
Proprieta'
总计1
总计2
没有格式化或隐藏的表如下所示:

   1                      2                     3             4
  +----------------------+---------------------+-------------+---
1 |         ...          |      (implied)         (implied)       <-- 0px high (hidden)
  +-                    -+---------------------+-------------+---
2 | "GENERALI SPA #1"    | "GENERALI SPA #2"   | "Proprieta" | ..
  +-                    -+-                   -+-------------+---
3 |         ...          |         ...         | "Totale #1" | ..
  +-                    -+---------------------+-------------+---
4 |         ...          | "Totale #2"               ...     | ..
  +----------------------+---------------------+-------------+---
由于单元格“2”跨越第一行和第二行,第二行的定义将考虑它。因此,r中的第二个TD
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td></tr>
<tr><td>6</td></tr>

rendering: 1 2 3 
           4 5 6
   1                      2                     3             4
  +----------------------+---------------------+-------------+---
1 |         ...          |      (implied)         (implied)       <-- 0px high (hidden)
  +-                    -+---------------------+-------------+---
2 | "GENERALI SPA #1"    | "GENERALI SPA #2"   | "Proprieta" | ..
  +-                    -+-                   -+-------------+---
3 |         ...          |         ...         | "Totale #1" | ..
  +-                    -+---------------------+-------------+---
4 |         ...          | "Totale #2"               ...     | ..
  +----------------------+---------------------+-------------+---
<TABLE border="1">
<TR><TD>1 <TD rowspan="2">2 <TD>3
<TR><TD>4 <TD>6
<TR><TD>7 <TD>8 <TD>9
</TABLE>
-------------
| 1 | 2 | 3 | 
----|   |----
| 4 |   | 6 |
----|---|----
| 7 | 8 | 9 |
-------------