如何通过Unirest从Confluence页面的Excellentable提取数据?
提取Confluence Excellentable表格数据的解决方案
直接请求Confluence页面URL会返回渲染后的HTML内容,而非结构化的表格数据。要获取Excellentable中的数据,需要通过Confluence REST API获取页面的宏原始数据,再解析其中的表格JSON。
步骤1:调用Confluence Content API获取页面宏数据
使用Confluence的Get Content API,指定展开body.storage来获取页面包含宏定义的原始存储内容,而非前端渲染后的页面。
示例Unirest代码
// 替换为你的Confluence域名和目标页面ID String confluenceDomain = "https://your-confluence-domain.com"; String targetPageId = "123456"; String apiEndpoint = confluenceDomain + "/rest/api/content/" + targetPageId + "?expand=body.storage"; HttpResponse<JsonNode> apiResponse = Unirest.get(apiEndpoint) .basicAuth(userId, userPw) .header("Accept", "application/json") .asJson();
步骤2:解析API响应,提取Excellentable宏的JSON数据
API返回的JSON中,body.storage.value字段是页面的存储HTML,其中包含Excellentable宏的定义。你可以用HTML解析库(如Jsoup)提取宏内的tableJson参数,该参数存储了表格的结构化数据。
解析示例(使用Jsoup)
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.fasterxml.jackson.databind.ObjectMapper; // 从API响应中取出存储HTML String storageHtml = apiResponse.getBody() .getObject() .getJSONObject("body") .getJSONObject("storage") .getString("value"); // 解析HTML找到Excellentable宏 Document doc = Jsoup.parse(storageHtml); // Jsoup处理自定义命名空间标签,需转义 Elements excellentableMacros = doc.select("ac|structured-macro[ac:name=excellentable]"); for (Element macro : excellentableMacros) { // 提取tableJson参数内容 Element tableJsonElement = macro.selectFirst("ac|parameter[ac:name=tableJson]"); if (tableJsonElement != null) { String tableJsonString = tableJsonElement.text(); // 将JSON字符串转为Java对象(需定义对应POJO) ObjectMapper objectMapper = new ObjectMapper(); ExcellentableTable tableData = objectMapper.readValue(tableJsonString, ExcellentableTable.class); // 操作表格数据,比如遍历行 for (Map<String, Object> row : tableData.getRows()) { // 处理每行数据 System.out.println(row); } } }
定义ExcellentableTable POJO(示例)
根据tableJson的实际结构,定义对应的Java类,示例结构如下:
import java.util.List; import java.util.Map; public class ExcellentableTable { private List<Map<String, Object>> rows; private List<Map<String, Object>> columns; // 其他字段根据实际JSON结构补充 // Getter和Setter方法 public List<Map<String, Object>> getRows() { return rows; } public void setRows(List<Map<String, Object>> rows) { this.rows = rows; } public List<Map<String, Object>> getColumns() { return columns; } public void setColumns(List<Map<String, Object>> columns) { this.columns = columns; } }
注意事项
- 确保你的Confluence账号拥有页面的读取权限,以及API访问权限。
- 不同版本的Excellentable可能会调整宏参数名称,如果
tableJson不存在,检查宏内的参数标签。 - 如果不想引入Jsoup,也可以用正则表达式匹配
tableJson的内容,但HTML解析库的可靠性更高。
内容的提问来源于stack exchange,提问作者이성우
相关产品推荐
相关产品推荐

