【问题标题】:Reorder html elements in a string using C#使用 C# 对字符串中的 html 元素重新排序
【发布时间】:2017-12-15 13:08:37
【问题描述】:

我有一个从服务返回的 html 字符串。我需要更新这个 html 服务器端(使用 .Net)并重新排序一些元素,然后再将其发送到客户端。作为一个简单的例子,假设我有一个如下所示的 html 字符串。如果字符串是如下表。我如何操纵它以将姓氏<th><td> 放入它自己的<tr> 中。 html 会更大、更复杂,但对于其中的一部分,下面说明了我需要如何更改它。由于实际 HTML 的复杂性,仅使用字符串替换效果不佳。

初始字符串

   "<table>
     <tbody>
      <tr>
        <th>First name</th>
        <td>some first name</td>
        <th>Last name</th>
        <td>some last name</td>
      </tr>
      <tr>
        <th>blah</td>
        <td>blah blah</td>
      </tr>
     </tbody>
    </table>
    "

修改后

   "<table>
     <tbody>
      <tr>
        <th>First name</th>
        <td>some first name</td>
      </tr>
        <th>Last name</th>
        <td>some last name</td>
      <tr>
        <th>blah</td>
        <td>blah blah</td>
      </tr>
     </tbody>
    </table>
    "

【问题讨论】:

  • 你的努力在哪里。 “什么是操纵的最佳方法” - 主要是基于意见的问题。
  • 从你的问题中不清楚你想做什么。请在您要进行的更改“之前”和“之后”发布订单。
  • 你能绕过返回 HTML 的 web 服务吗?如果它只是一个表,这可以更好地表示为字符串数组的 JSON 对象。对于这种特殊情况,如果您希望它绝对干净,您甚至可以编写 XSLT 转换(将 HTML 视为 XML,w3schools.com/xsl)并将其应用于 XML 文档。否则,你应该更好地指定你想要做什么样的“操作”,即给出一些预期的输出。
  • 很抱歉最初的问题是如何组合在一起的。我已经更新了。
  • 您的 HTML 后看起来好像在姓氏列周围缺少额外的 &lt;tr&gt;&lt;/tr&gt;

标签: c# html .net


【解决方案1】:

我知道 URL 答案不受欢迎,但您应该查看 HTML Agility Pack。它是为这种事情而设计的。

http://html-agility-pack.net/?z=codeplex

【讨论】:

    【解决方案2】:

    出于此答案的目的,我将做出愚蠢的假设,即您已阅读字符串列表中的文件。让我们将此列表命名为 HTMLLines。那么以下应该做你想做的事

    int length=HTMLLines.Count;
    for(int loop=0;loop<length;loop++)
    {
         if(HTMLLines[loop].Equals("<th>Last name</th>"))
         {
              HTMLLines[loop]="</tr>\n<tr>\n"+HTMLLines[loop];
              //break;//If there is only one occurrence, remove the leading // else keep that to repeat for each occurence
         }
    }
    

    如果你在这个循环之后保存列表,你应该得到想要的输出。

    此代码假定列表中没有空值。如果有任何空值,则应将HTMLLines[loop].Equals("&lt;th&gt;Last name&lt;/th&gt;") 替换为HTMLLines[loop]=="&lt;th&gt;Last name&lt;/th&gt;"

    如果"&lt;th&gt;Last name&lt;/th&gt;" 只是您用于此问题的一个样本,不能用于精确匹配,那么您应该将所有可能的匹配项放入一个数组并在每个循环中检查它们。在这种情况下,如果我们将数组命名为theHeaders,代码将类似于:

    int length=HTMLLines.Count;
    for(int loop=0;loop<length;loop++)
    {
         for(int loop1=0;loop1<theHeaders.Length;loop1++)
         {
             if(HTMLLines[loop].Equals(theHeaders[loop1]))
             {
                  HTMLLines[loop]="</tr>\n<tr>\n"+HTMLLines[loop];
                  break;
             }
        }
    }
    

    我希望这有助于为您指明正确的方向。

    【讨论】:

    • 超级有帮助,尤其是最后一部分
    【解决方案3】:

    一个非常简单的方法可能是......

    var result = htmlString.Replace("<th>Last name</th>", "</tr><tr><th>Last name</th>");
    

    如果您需要比这更复杂的内容,则需要为您的问题添加更多细节。

    【讨论】:

    • 不幸的是,这对我来说太简单了。我在问题中添加了一些额外的细节。
    • 我的解决方案仍然适用于您更新的详细信息。您需要提供所有预期的数据案例。您是否尝试用 4 cols to 2 替换任何案例?还是所有姓氏?或者通常修复表格列中的任何不匹配,这要困难得多。
    • 标签中的内容是动态的,这就是我认为这行不通的原因
    • 你能举出不同的例子吗?目前很难说出我们在 HTML 中应该期待什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多