Как исправить HTML с помощью HTML Agility Pack - PullRequest
0 голосов
/ 12 февраля 2011

У меня есть сотни 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> в правильном месте. Я бы сделал RTFM, если бы смог найти TFM, но он не очень хорошо документирован. Вот то, что я придумал (это исключение). Как вставить текст в правильное место?

    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 Ответ

2 голосов
/ 13 февраля 2011

ASPX-файлы не являются HTML-файлами. Использование пакета HTMLAgility для этого, вероятно, не лучший подход. Вы проверяли, правильно ли проверяются <%...%> выражения в пакете HTMLAgility?

Более простой подход - использовать функцию замены в Visual Studio с регулярным выражением. Нажав «заменить» 100 раз, было бы намного проще, чем писать и отлаживать этот код.

RegEx будет выглядеть примерно так: -

Найти:

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

Заменить:

\<td class=\1\>
...