繁体   English   中英

如何在逻辑应用程序中将 HTML 表转换为 JSON

[英]How do I convert an HTML table into JSON in Logic Apps

我正在构建一个逻辑应用程序来处理我们收到的 email 回复之前的呼叫。 第一个 email 是确认 email,它包括一个表格,指示哪些公用事业提供商已收到通知。 我想将该表的内容添加到 excel 电子表格中,并在此过程中添加我们自己的参考编号。 在这个答案中找到了一个可能的解决方案,取自John Dyer's Blog

    var data = [];

    // first row needs to be headers
    var headers = [];
    for (var i=0; i<table.rows[0].cells.length; i++) {
        headers[i] = table.rows[0].cells[i].innerHTML.toLowerCase().replace(/ /gi,'');
    }

    // go through cells
    for (var i=1; i<table.rows.length; i++) {

        var tableRow = table.rows[i];
        var rowData = {};

        for (var j=0; j<tableRow.cells.length; j++) {

            rowData[ headers[j] ] = tableRow.cells[j].innerHTML;

        }

        data.push(rowData);
    }       

    return data;
}

我尝试在 Azure Function 中使用此代码,但是当它让我下载 VS 时,它变得越来越复杂。 我找不到在门户中添加代码的方法。 我安装了 VS,但它很快就开始超越我。

我找到了一个在线转换器,并用它将代码转换为 C++,所以我可以在 .net function 中使用它。

#include <stdio.h>
int main()
{
      printf("function tableToJson(table) {
    var data = [];

    // first row needs to be headers
    var headers = [];
    for (var i=0; i<table.rows[0].cells.length; i++) {
        headers[i] = table.rows[0].cells[i].innerHTML.toLowerCase().replace(/ /gi,'');
    }

    // go through cells
    for (var i=1; i<table.rows.length; i++) {

        var tableRow = table.rows[i];
        var rowData = {};

        for (var j=0; j<tableRow.cells.length; j++) {

            rowData[ headers[j] ] = tableRow.cells[j].innerHTML;

        }

        data.push(rowData);
    }       

    return data;
}\n");
      return 0;
}

我使用了两个 compose 操作将邮件内容缩减为相关表格:

 <table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="100%" style="width:100.0%; border-collapse:collapse; border:none"> <tbody> <tr> <td colspan="3" valign="top" style="border:solid gray 1.0pt; background:#9CCC6B; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal"> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black">MEMBERS NOTIFIED: The following owners of underground infrastructure in the area of your excavation site have been notified.</span> </b> </p> </td> </tr> <tr> <td width="50%" valign="top" style="width:50.0%; border-top:none; border-left:solid gray 1.0pt; border-bottom:solid gray 1.0pt; border-right:none; background:#9CCC6B; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black">Member name</span> </b> </p> </td> <td width="25%" valign="top" style="width:25.0%; border-top:none; border-left:solid gray 1.0pt; border-bottom:solid gray 1.0pt; border-right:none; background:#9CCC6B; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black">Station Code</span> </b> </p> </td> <td width="25%" valign="top" style="width:25.0%; border:solid gray 1.0pt; border-top:none; background:#9CCC6B; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black">Initial Status</span> </b> </p> </td> </tr> <tr> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">G-TEL FOR ENBRIDGE GAS (LEGACY UNION GAS) (ENOW01)</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">ENOW01</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:none; border-right:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">Notification sent</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> </tr> <tr> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">CITY OF STRATFORD (STRATWS01)</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">STRATWS01</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:none; border-right:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">Notification sent</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> </tr> <tr> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">FESTIVAL HYDRO (LOCAL HYDRO) (FESTH01)</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">FESTH01</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:none; border-right:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">Notification sent</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> </tr> <tr> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">WIGHTMAN TELECOM - FIBRE - LIMITED (WT01)</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">WT01</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:none; border-right:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">Notification sent</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> </tr> <tr> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">CLI FOR ROGERS (ROGWAT01)</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border:none; border-left:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">ROGWAT01</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:none; border-right:solid gray 1.0pt; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">Cleared</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> </tr> <tr> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:solid gray 1.0pt; border-right:none; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">G-TEL FOR BELL CANADA (BCOW01)</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border-top:none; border-left:solid gray 1.0pt; border-bottom:solid gray 1.0pt; border-right:none; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">BCOW01</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> <td valign="top" style="border:solid gray 1.0pt; border-top:none; padding:3.75pt.75pt 3.75pt 3.75pt"> <p class="MsoNormal" align="center" style="text-align:center"> <span class="value"> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif">Notification sent</span> </span> <b> <span style="font-size:9.0pt; font-family:&quot;Arial&quot;,sans-serif; color:black"></span> </b> </p> </td> </tr> </tbody> </table>

This HTML becomes the input to Azure Function action and the Function I created using the C++ code that was output by the conversion and referenced above.

我在 output 上收到内部服务器错误 500。

我希望有人能指出我正确的方向来解决这个问题。 我显然做错了什么!

我希望我走在正确的轨道上,但是下面的这段代码(尽管非常特定于您的用例)将读取 HTML 表并返回数据的 JSON 表示。

只需在 .NET 中创建一个名为ConvertHtmlTableToJson的新 Azure Function 并将其粘贴进去。

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Xml;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    var outputTable = new List<List<String>>();

    string requestBody = String.Empty;

    using (StreamReader streamReader = new StreamReader(req.Body))
    {
        requestBody = await streamReader.ReadToEndAsync();
    }

    dynamic data = JsonConvert.DeserializeObject(requestBody);
    string xmlString = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String((string)data?.Content));;

    var xmlDocument = new XmlDocument();
    xmlDocument.LoadXml(xmlString);

    // Get the rows
    var xmlRows = xmlDocument.DocumentElement.SelectNodes("//tr");

    foreach (XmlNode xmlRow in xmlRows)
    {
        // Now get the columns.
        var xmlColumns = xmlRow.SelectNodes(".//td");
        var row = new List<string>();

        foreach (XmlNode xmlColumn in xmlColumns)
        {
            var value = xmlColumn.SelectSingleNode(".//span[@class='value']");

            if (value != null)
                row.Add(value?.InnerText);
        }

        if (row.Count > 0)
            outputTable.Add(row);
    }
   
    return new OkObjectResult(outputTable);
}

它接受 Base64 字符串,即您在示例中提供的 HTML 数据。

有几点要注意...

  • 查找具有class="value"属性的span元素是硬编码的,这与您收到的 email 和您提供的 HTML 一致。
  • 它不检查不平衡的列,即如果一行缺少一个值,您可能会得到一行的两列和另一行的三列。
  • 标题被忽略,因为它仅在td元素中搜索,其中存在具有第一个点中指定的属性条件的span元素。

只要您的 email 保持不变,并且您传入您作为示例提供的相同结构,这将为您提取数据。 除此之外,还需要加强。

从那里,您应该能够使用它返回的二维数组将数据加载到 Excel 表中。

这就是我在 LogicApps 中表示它的方式......

HTML 变量

HTML 变量

这是请求中的正文...

{
  "Content": "@{base64(variables('HTML'))}"
}

结果

结果

[
  [
    "G-TEL FOR ENBRIDGE GAS (LEGACY UNION GAS) (ENOW01)",
    "ENOW01",
    "Notification sent"
  ],
  [
    "CITY OF STRATFORD (STRATWS01)",
    "STRATWS01",
    "Notification sent"
  ],
  [
    "FESTIVAL HYDRO (LOCAL HYDRO) (FESTH01)",
    "FESTH01",
    "Notification sent"
  ],
  [
    "WIGHTMAN TELECOM - FIBRE - LIMITED (WT01)",
    "WT01",
    "Notification sent"
  ],
  [
    "CLI FOR ROGERS (ROGWAT01)",
    "ROGWAT01",
    "Cleared"
  ],
  [
    "G-TEL FOR BELL CANADA (BCOW01)",
    "BCOW01",
    "Notification sent"
  ]
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM