Mon application utilise le pack htmlagility. À partir de maintenant, je peux obtenir tous les éléments d'entrée d'un formulaire. Le problème est que je reçois TOUS les éléments d’entrée par ID. J'essaie de le réduire pour ne me donner que les éléments d'entrée d'un formulaire par ID qui contiennent des étiquettes de texte internes exactes avant chaque élément d'entrée.
Exemple:
<label for="email">Email Address:</label>
<input type="text" class="textbox" name="email" id="email" maxlength="50" value="" dir="ltr" tabindex="1"
J'essaie d'obtenir l'entrée qui a une étiquette de procédure avec le texte intérieur de "Adresse électronique"
Comment pourrais-je dire cela?
Voici mon application qui saisit TOUS les éléments en entrée par ID.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim doc As HtmlDocument
Dim web As New HtmlWeb
doc = web.Load("http://shaggybevo.com/board/register.php")
Dim docNode As HtmlNode = doc.DocumentNode
Dim nodes As HtmlNodeCollection = docNode.SelectNodes("//input")
'SelectNodes takes a XPath expression
For Each node As HtmlNode In nodes
'Get all input elements by id
Dim id As String = node.GetAttributeValue("value", "id")
'print all input elements by id to form2 richtextbox
Form2.RichTextBox1.Text = Form2.RichTextBox1.Text & Environment.NewLine & id.ToString & name.ToString()
Form2.Show()
Next
End Sub
Merci les gars .... Je dois dire que j'ai étudié VB.NET depuis un moment et à ce jour, ce forum a été génial ... heureux de l'avoir trouvé ..
Le concept de base consiste à obtenir les étiquettes dont l'attribut for
correspond à l'id de l' input
associée.
Ainsi, nous parcourons d’abord les étiquettes et enregistrons le texte de l’étiquette dans un dictionnaire indexé par la valeur for
, puis nous parcourons les inputs
. Si l’id de l’entrée est dans le dictionnaire, nous récupérons la valeur du dictionnaire ( qui est le texte de l’étiquette) et le montrer.
Notez que j'ai également modifié la manière dont les données sont collectées pour être plus efficaces (presque chaque fois que vous concaténez des chaînes, vous devez utiliser le constructeur de chaînes).
Voici le code réécrit:
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()