我试图在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文件的其他部分可能具有相同的文本,使事情变得复杂。
也许我在思考这个问题,但我只是在努力找到一个很好的方法来突出差异而不是整条线。
答案 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