Основная концепция здесь состоит в том, чтобы получить метки, чей атрибут for
соответствует идентификатору ассоциированного input
.
Итак, сначала мы перебираем метки и записываем текст метки в словаре, который имеет значение for
, затем мы перебираем inputs
, и если идентификатор ввода находится в словаре, мы получить значение из словаря (который является текстом метки) и показать его.
Обратите внимание, что я также изменил способ сбора данных, чтобы сделать его более эффективным (почти каждый раз, когда вы объединяете строки, вы должны использовать stringbuilder).
Вот переписанный код:
Dim web As HtmlAgilityPack.HtmlWeb = New HtmlWeb()
Dim doc As HtmlAgilityPack.HtmlDocument = web.Load("http://shaggybevo.com/board/register.php")
Dim nodes As HtmlNodeCollection
' Keeps track of the labels by the associated control id
Dim labelText As New System.Collections.Generic.Dictionary(Of String, String)
' First, get the labels
nodes = doc.DocumentNode.SelectNodes("//label")
If nodes IsNot Nothing Then
For Each node In nodes
If node.Attributes.Contains("for") Then
Dim sFor As String
' Extract the for value
sFor = node.Attributes("for").Value
' If it does not exist in our dictionary, add it
If Not labelText.ContainsKey(sFor) Then
labelText.Add(sFor, node.InnerText)
End If
End If
Next
End If
nodes = doc.DocumentNode.SelectNodes("//input")
Dim sbText As New System.Text.StringBuilder(500)
If nodes IsNot Nothing Then
For Each node In nodes
' See if this input is associated with a label
If labelText.ContainsKey(node.Id) Then
' If it is, add it to our collected information
sbText.Append("Label = ").Append(labelText(node.Id))
sbText.Append(", Id = ").Append(node.Id)
sbText.AppendLine()
End If
Next
End If
Form2.RichTextBox1.Text = sbText.ToString
Form2.Show()