From 3160b21ea60023cc9953a5bdf415ac9d03427e79 Mon Sep 17 00:00:00 2001 From: Omkar A Date: Wed, 6 Mar 2024 19:14:47 +0530 Subject: [PATCH] Code for parsing HTML table using Jsoup As suggested, moved from libraries-4 directory to jsoup directory in the repo. --- .../com/baeldung/jsoup/JsoupTableParser.java | 122 ++++++++++++++++++ jsoup/src/main/resources/Students.html | 73 +++++++++++ .../jsoup/JsoupTableParserUnitTest.java | 52 ++++++++ 3 files changed, 247 insertions(+) create mode 100644 jsoup/src/main/java/com/baeldung/jsoup/JsoupTableParser.java create mode 100644 jsoup/src/main/resources/Students.html create mode 100644 jsoup/src/test/java/com/baeldung/jsoup/JsoupTableParserUnitTest.java diff --git a/jsoup/src/main/java/com/baeldung/jsoup/JsoupTableParser.java b/jsoup/src/main/java/com/baeldung/jsoup/JsoupTableParser.java new file mode 100644 index 0000000000..46986856e2 --- /dev/null +++ b/jsoup/src/main/java/com/baeldung/jsoup/JsoupTableParser.java @@ -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> 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 headers = new ArrayList(); + for (Element header : headerRow) { + headers.add(header.text()); + } + + List> parsedDataRows = new ArrayList>(); + for (int row = 0; row < dataRows.size(); row++) { + Elements colVals = dataRows.get(row) + .select("th,td"); + + int colCount = 0; + Map dataRow = new HashMap(); + 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); + } + } +} diff --git a/jsoup/src/main/resources/Students.html b/jsoup/src/main/resources/Students.html new file mode 100644 index 0000000000..f3596b0409 --- /dev/null +++ b/jsoup/src/main/resources/Students.html @@ -0,0 +1,73 @@ + + + + + + Student Results + + + + +

Student Results

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameMathsEnglishScience
Student 1908592
Student 2889187
Student 3789589
Student 4948291
Student 5858893
+ + + diff --git a/jsoup/src/test/java/com/baeldung/jsoup/JsoupTableParserUnitTest.java b/jsoup/src/test/java/com/baeldung/jsoup/JsoupTableParserUnitTest.java new file mode 100644 index 0000000000..e7be309afb --- /dev/null +++ b/jsoup/src/test/java/com/baeldung/jsoup/JsoupTableParserUnitTest.java @@ -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> 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> 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> 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> tableData = jsoParser.parseTable(doc, 0); + int countBeforeDel = tableData.size(); + jsoParser.deleteRowFromTable(doc, 0, 2); + tableData = jsoParser.parseTable(doc, 0); + assertEquals(countBeforeDel - 1, tableData.size()); + } +}