如何使用HTML Agility Pack修复HTML

时间:2011-02-12 20:31:07

标签: .net html-agility-pack

我有数百个ASPX文件,我需要重构一下。我有几次这样的代码:

<td style="text-align: right;">
  <span class="frmFldLbl">Task (or some other text)</span>
</td>

并且所有frmFldLbl都定义了颜色和文字大小。所以我想把上面改为:

<td class="frmFldLbl">
  Task (or some other text)
</td>

更干净!它的功能相同,因为我也会将text-align: right;放在frmFldLbl类定义上。

现在,我只担心让这个工作为一个文件,然后我将添加目录递归和所有好东西。我正在使用HTML Agility Pack来解析HTML文件,并且我可以使用XPATH来选择我用于重构的范围。

我需要做的是,如何在正确的位置将文本插入<td>的子项中。如果我能找到TFM,我会RTFM,但它似乎没有很好的记录。这是我提出的(它引发了一个例外)。 如何在正确的位置插入文字?

    Dim doc As New HtmlDocument()
    doc.Load(fileName)
    Dim culpritNodes As HtmlNodeCollection = doc.DocumentNode.SelectNodes("//td/span[@class='frmFldLbl']")

    If culpritNodes IsNot Nothing Then
        For Each culpritNode As HtmlNode In culpritNodes

            Dim culpritNodeIndex As Int32 = culpritNode.ParentNode.ChildNodes.IndexOf(culpritNode)
            Dim culpritNodeText As String = culpritNode.InnerHtml
            Dim parentTdClassAtt As HtmlAttribute = culpritNode.ParentNode.Attributes("class")

            If Not parentTdClassAtt.Value.Contains("frmFldLbl") Then

                If Not String.IsNullOrEmpty(parentTdClassAtt.Value) Then parentTdClassAtt.Value += " "
                parentTdClassAtt.Value += "frmFldLbl"

            End If

            Dim replacementNode As New HtmlNode(HtmlNodeType.Text, doc, 0)
            replacementNode.InnerHtml = culpritNodeText
            culpritNode.ParentNode.ChildNodes.Insert(culpritNodeIndex, replacementNode)
            culpritNode.Remove()

        Next
    End If

    doc.Save(fileName)

1 个答案:

答案 0 :(得分:2)

ASPX文件不是HTML文件。使用HTMLAgility包执行此操作可能不是最好的方法。您是否通过HTMLAgility包测试了<%...%>表达式是否正确往返?

更简单的方法是在Visual Studio中使用带有正则表达式的替换功能。单击“替换”100次将比编写和调试此代码容易得多。

RegEx将如下所示: -

查找:

\<td style=:q\>\n:Wh*\<span class={:q}\>

替换:

\<td class=\1\>