突出显示两个RichTextBox之间的文本差异

时间:2017-11-14 15:00:48

标签: xml vb.net richtextbox

我试图在VB.NET中比较两个XML文件,每个文件放入不同的RichTextBox。第一个RichTextBox将具有原始XML文件,而第二个RichTextBox将具有更新的XML文件。我想强调第二个RichTextBox中两个文件之间的差异。

目前,我只是将原始XML文件中的每一行文本放入List(Of String)中。然后我循环遍历第二个RichTextBox的所有行,如果List(Of String)不包含该行,那么我知道该行已添加(新行)或已编辑,因此必须在第二个RichTextBox。

这是代码:

Dim sRichTextBox1Lines() As String = RichTextBox1.Lines
Dim sRichTextBox2Lines() As String = RichTextBox2.Lines
Dim sLines As List(Of String) = New List(Of String)
Dim sRichTextBox2Line As String = ""
Dim nIndexStartOfCurrLine As Integer = 0

For i As Integer = 0 To (sRichTextBox1Lines.Length - 1)
    sLines.Add(sRichTextBox1Lines(i))
Next

For i As Integer = 0 To (sRichTextBox2Lines.Length)
    sRichTextBox2Line = sRichTextBox2Lines(i).ToString
    nIndexStartOfCurrLine = RichTextBox2.GetFirstCharIndexFromLine(i)
        If (Not sLines.Contains(sRichTextBox2Line)) Then
            RichTextBox2.Select(nIndexStartOfCurrLine, sRichTextBox2Lines(i).Length)
            RichTextBox2.SelectionColor = Color.White
            RichTextBox2.SelectionBackColor = Color.Red
        End If
    Next

这可以胜任。但是,我只考虑突出显示实际差异,例如添加空格,而不是简单地突出整行。

现在这就是我遇到问题的地方。我正在考虑逐行并比较每一行以仅突出显示两条线之间的差异,但这种方法存在问题(例如,一条线被移除,一条线被注释掉并在下一行修改,添加了一个空白行,等等。代码变得非常复杂,很难遵循。例如,假设这是在第一个XML文件(RichTextBox1)中:

<add key="Test123A" value="123A"/>
<add key="Test123B" value="123B"/>
<add key="Test123C" value="123C"/>
<add key="Test123D" value="123D"/>

假设这是在第二个XML文件(RichTextBox2)中:

<add key="Test123A" value="123A"/>
<!--<add key="Test123B" value="123B"/>--> 
<add key="Test123B" value="456B" />
<add key="Test123C" value="123C" />
<add key="Test123D" value="123D" />   

由于第2行和第3行与原始XML文件中的任何内容都不匹配,因此逐行比较会混乱。另外,请注意,在新XML文件中的最后一个引号之后现在有一个空格,这不是一个巨大的差异(字面意思是1个字符的区别)。我正在考虑使用SubStrings,但XML文件的其他部分可能具有相同的文本,使事情变得复杂。

也许我在思考这个问题,但我只是在努力找到一个很好的方法来突出差异而不是整条线。

1 个答案:

答案 0 :(得分:0)

据推测,关键属性是唯一值,您只想比较值是否不同。如果是这种情况,则将两个XML文件加载到XDocument对象中,将RichTextBox控件的Text属性设置为各自的XDocument。然后遍历XDocument A的每个<add>以获取共享相同键的XDocument B的<add>,以便您可以比较值是否不同。如果是,则在RichTextBox中找到XElement以突出显示它。

这是一个快速(自由类型未经测试)的例子:

'Declare and load the documents
Dim documentA, documentB As New XDocument
documentA.Load("FileA.xml")
documentB.Load("FileB.xml")

'Display the files in the RTB
RichTextBox1.Text = documentA.ToString()
RichTextBox2.Text = documentB.ToString()

'Placeholder variables
Dim addB As XElement

'Iterate through each <add> element
For Each addA As XElement In documentA.Descendants("add")
  'Check to make sure that the <add> has a key and value attribute
  If addA.HasAttribute("key") AndAlso addB.HasAttribute("value") Then
    addB = documentB.Descendants("add").FirstOrDefault(Function(e) e.HasAttribute("key") AndAlso e.Attribute("key") = addA.Attribute("key"))

    'Check to make sure that it found an element with the same key and that it also has a value and that the values does not match <addA>'s value
    If addB IsNot Nothing AndAlso addB.HasAttribute("value") AndAlso addB.Attribute("value") <> addA.attribute("value") Then
      'Get the index of <addB>
      Dim index As Integer = RichTextBox2.Find(addB.ToString())

      With RichTextBox2
        .Select(index, addB.ToString().Length()) 'Select the tag
        .SelectionColor = Color.White 'Change the font color
        .SelectionBackColor = Color.Read 'Change the background color
      End With      
    End If
  End If
Next