2011-02-12 61 views
0

我有数百个ASPX文件需要重构一下。我有此代码的几个事件:如何使用HTML敏捷包修复HTML

<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) 

回答

2

ASPX文件不是HTML文件。使用HTMLAgility包来做到这一点可能不是最好的方法。您是否测试了解<%...%>表达式是否可以通过HTMLAgility包正确往返?

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

正则表达式看起来像: -

查找:

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

替换:

\<td class=\1\> 
+0

我在这里感谢您的输入。也许HTML敏捷包不适合aspx文件。但我没有看到VS中的Replace功能会如何更好。首先,我需要学习用愚蠢的VS风格的正则表达式来编写正则表达式。我将无法使用替换 - 我会用什么替换它?据我所知,VS不够聪明,无法确定哪个元素是跨度的父元素,并在其上应用类 - 这仍然需要手动。 – 2011-02-13 04:07:45