Code for parsing HTML table using Jsoup
As suggested, moved from libraries-4 directory to jsoup directory in the repo.
This commit is contained in:
parent
5af7b8c289
commit
3160b21ea6
|
@ -0,0 +1,122 @@
|
||||||
|
package com.baeldung.jsoup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
public class JsoupTableParser {
|
||||||
|
|
||||||
|
public Document loadFromString(String html) {
|
||||||
|
return Jsoup.parse(html);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document loadFromURL(String url) throws IOException {
|
||||||
|
Document doc = Jsoup.connect(url)
|
||||||
|
.get();
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document loadFromFile(String filePath) {
|
||||||
|
Document doc = null;
|
||||||
|
try {
|
||||||
|
File input = new File(JsoupTableParser.class.getClassLoader()
|
||||||
|
.getResource(filePath)
|
||||||
|
.getFile());
|
||||||
|
doc = Jsoup.parse(input, "UTF-8", "");
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Map<String, String>> parseTable(Document doc, int tableOrder) {
|
||||||
|
Element table = doc.select("table")
|
||||||
|
.get(tableOrder);
|
||||||
|
Element tbody = table.select("tbody")
|
||||||
|
.get(0);
|
||||||
|
Elements dataRows = tbody.select("tr");
|
||||||
|
Elements headerRow = table.select("tr")
|
||||||
|
.get(0)
|
||||||
|
.select("th,td");
|
||||||
|
|
||||||
|
List<String> headers = new ArrayList<String>();
|
||||||
|
for (Element header : headerRow) {
|
||||||
|
headers.add(header.text());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Map<String, String>> parsedDataRows = new ArrayList<Map<String, String>>();
|
||||||
|
for (int row = 0; row < dataRows.size(); row++) {
|
||||||
|
Elements colVals = dataRows.get(row)
|
||||||
|
.select("th,td");
|
||||||
|
|
||||||
|
int colCount = 0;
|
||||||
|
Map<String, String> dataRow = new HashMap<String, String>();
|
||||||
|
for (Element colVal : colVals) {
|
||||||
|
dataRow.put(headers.get(colCount++), colVal.text());
|
||||||
|
}
|
||||||
|
parsedDataRows.add(dataRow);
|
||||||
|
}
|
||||||
|
return parsedDataRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTableData(Document doc, int tableOrder, String updateValue) {
|
||||||
|
Element table = doc.select("table")
|
||||||
|
.get(tableOrder);
|
||||||
|
Element tbody = table.select("tbody")
|
||||||
|
.get(0);
|
||||||
|
Elements dataRows = tbody.select("tr");
|
||||||
|
|
||||||
|
for (int row = 0; row < dataRows.size(); row++) {
|
||||||
|
Elements colVals = dataRows.get(row)
|
||||||
|
.select("th,td");
|
||||||
|
|
||||||
|
for (int colCount = 0; colCount < colVals.size(); colCount++) {
|
||||||
|
colVals.get(colCount)
|
||||||
|
.text(updateValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addRowToTable(Document doc, int tableOrder) {
|
||||||
|
Element table = doc.select("table")
|
||||||
|
.get(tableOrder);
|
||||||
|
Element tbody = table.select("tbody")
|
||||||
|
.get(0);
|
||||||
|
|
||||||
|
Elements rows = table.select("tr");
|
||||||
|
Elements headerCols = rows.get(0)
|
||||||
|
.select("th,td");
|
||||||
|
int numCols = headerCols.size();
|
||||||
|
|
||||||
|
Elements colVals = new Elements(numCols);
|
||||||
|
for (int colCount = 0; colCount < numCols; colCount++) {
|
||||||
|
Element colVal = new Element("td");
|
||||||
|
colVal.text("11");
|
||||||
|
colVals.add(colVal);
|
||||||
|
}
|
||||||
|
Elements dataRows = tbody.select("tr");
|
||||||
|
Element newDataRow = new Element("tr");
|
||||||
|
newDataRow.appendChildren(colVals);
|
||||||
|
dataRows.add(newDataRow);
|
||||||
|
tbody.html(dataRows.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteRowFromTable(Document doc, int tableOrder, int rowNumber) {
|
||||||
|
Element table = doc.select("table")
|
||||||
|
.get(tableOrder);
|
||||||
|
Element tbody = table.select("tbody")
|
||||||
|
.get(0);
|
||||||
|
Elements dataRows = tbody.select("tr");
|
||||||
|
if (rowNumber < dataRows.size()) {
|
||||||
|
dataRows.remove(rowNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Student Results</title>
|
||||||
|
<style>
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 50%;
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
border: 1px solid #dddddd;
|
||||||
|
text-align: left;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h2>Student Results</h2>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Maths</th>
|
||||||
|
<th>English</th>
|
||||||
|
<th>Science</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Student 1</td>
|
||||||
|
<td>90</td>
|
||||||
|
<td>85</td>
|
||||||
|
<td>92</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Student 2</td>
|
||||||
|
<td>88</td>
|
||||||
|
<td>91</td>
|
||||||
|
<td>87</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Student 3</td>
|
||||||
|
<td>78</td>
|
||||||
|
<td>95</td>
|
||||||
|
<td>89</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Student 4</td>
|
||||||
|
<td>94</td>
|
||||||
|
<td>82</td>
|
||||||
|
<td>91</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Student 5</td>
|
||||||
|
<td>85</td>
|
||||||
|
<td>88</td>
|
||||||
|
<td>93</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.baeldung.jsoup;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class JsoupTableParserUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDocumentTableParsed_thenTableDataReturned() {
|
||||||
|
JsoupTableParser jsoParser = new JsoupTableParser();
|
||||||
|
Document doc = jsoParser.loadFromFile("Students.html");
|
||||||
|
List<Map<String, String>> tableData = jsoParser.parseTable(doc, 0);
|
||||||
|
assertEquals("90", tableData.get(0).get("Maths"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenTableUpdated_thenUpdatedDataReturned() {
|
||||||
|
JsoupTableParser jsoParser = new JsoupTableParser();
|
||||||
|
Document doc = jsoParser.loadFromFile("Students.html");
|
||||||
|
jsoParser.updateTableData(doc, 0, "50");
|
||||||
|
List<Map<String, String>> tableData = jsoParser.parseTable(doc, 0);
|
||||||
|
assertEquals("50", tableData.get(2)
|
||||||
|
.get("Maths"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenTableRowAdded_thenRowCountIncreased() {
|
||||||
|
JsoupTableParser jsoParser = new JsoupTableParser();
|
||||||
|
Document doc = jsoParser.loadFromFile("Students.html");
|
||||||
|
List<Map<String, String>> tableData = jsoParser.parseTable(doc, 0);
|
||||||
|
int countBeforeAdd = tableData.size();
|
||||||
|
jsoParser.addRowToTable(doc, 0);
|
||||||
|
tableData = jsoParser.parseTable(doc, 0);
|
||||||
|
assertEquals(countBeforeAdd + 1, tableData.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenTableRowDeleted_thenRowCountDecreased() {
|
||||||
|
JsoupTableParser jsoParser = new JsoupTableParser();
|
||||||
|
Document doc = jsoParser.loadFromFile("Students.html");
|
||||||
|
List<Map<String, String>> tableData = jsoParser.parseTable(doc, 0);
|
||||||
|
int countBeforeDel = tableData.size();
|
||||||
|
jsoParser.deleteRowFromTable(doc, 0, 2);
|
||||||
|
tableData = jsoParser.parseTable(doc, 0);
|
||||||
|
assertEquals(countBeforeDel - 1, tableData.size());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue