Wie bekomme ich den inneren Text eines Labels vor einem Eingabeelement?

html-agility-pack vb.net

Frage

Meine App verwendet das Paket htmlagility. Ab sofort kann ich alle Eingabeelemente auf einem Formular abrufen. Das Problem ist, dass ich ALLE Eingabeelemente nach ID bekomme. Ich versuche, es einzugrenzen, um nur Eingabeelemente eines Formulars nach ID zu geben, die exakte innere Textbeschriftungen vor jedem Eingabeelement enthalten.

Beispiel:

<label for="email">Email Address:</label>
<input type="text" class="textbox" name="email" id="email" maxlength="50" value="" dir="ltr" tabindex="1" 

Ich versuche, die Eingabe zu erhalten, die ein fortlaufendes Label mit dem inneren Text von "Email Address" hat

Wie würde ich das sagen?

Hier ist meine App, die alle Eingabeelemente nach ID ergreift.

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

Danke Jungs .... Ich muss sagen, ich habe VB.NET für eine Weile studiert und bis heute dieses Forum war fantastisch ... froh, dass ich es gefunden habe ..

Akzeptierte Antwort

Das Grundkonzept ist hier die Etiketten , deren bekommen for Attribut entspricht der ID des zugehörigen input .

Wir durchlaufen zuerst die Beschriftungen und zeichnen den Text des Etiketts in einem Wörterbuch auf, das durch den Wert for codiert wird. Dann durchlaufen wir die inputs und wenn die ID der Eingabe im Wörterbuch ist, rufen wir den Wert aus dem Wörterbuch ab ( das ist der Etikettentext) und zeige es an.

Beachten Sie, dass ich auch modifiziert habe, wie die Daten gesammelt werden, um effizienter zu sein (fast jedes Mal, wenn Sie Zeichenfolgen verketten, sollten Sie stringbuilder verwenden).

Hier ist der umgeschriebene Code:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum