Wie wähle ich mit XPath untergeordnete Elemente beliebiger Tiefe aus?

101

Angenommen, ich habe dies (vereinfacht):

<form id="myform">
    <!-- some input fields -->
    <input type="submit" value="proceed"/>
</form>

Dann kann ich die Senden-Schaltfläche von XPath auswählen //form[@id='myform']/input[@type='submit']. Toll.

Meine Vorlagen können sich jedoch ändern, und ich möchte in der Tiefe, in der sich die Schaltfläche "Senden" befindet, flexibel sein. Es könnte in eine Tabelle wie folgt gestellt werden:

<form id="myform">
    <!-- some input fields -->
    <table><tr><td>
           <input type="submit" value="proceed"/>
    </td></tr></table>
</form>

Ich weiß, dass ich Elemente auswählen kann, die Enkelkinder sind, aber ich kann keine Groß-Groß-Groß-Kinder jeglicher Tiefe auswählen. Z.B:

  • //form[@id='myform']/*/input[@type='submit'] wählt nur Enkelkinder aus, keine weiteren Tiefen.
  • //form[@id='myform']/*/*/input[@type='submit'] wählt nur Enkel aus, keine weiteren oder weniger Tiefen.
  • //form[@id='myform']/**/input[@type='submit'] ist ungültig.

Wie wähle ich diese Schaltfläche zum Senden zuverlässig aus, ohne Element-IDs zu verwenden?

gertvdijk
quelle

Antworten:

157

Du bist fast da. Verwenden Sie einfach:

//form[@id='myform']//input[@type='submit']

Die //Verknüpfung kann auch innerhalb eines Ausdrucks verwendet werden.

nwellnhof
quelle
C # scheint diese Notation nicht zu verstehen. //form//inputgibt null in C # zurück, während Chrome 35 Eingaben mit demselben xpath finden kann
Achilles
1
Mein letzter Kommentar wird hier besprochen: stackoverflow.com/questions/23232671/…
Achilles
14

Wenn Sie XmlDocument und XmlNode verwenden.

Sagen:

XmlNode f = root.SelectSingleNode("//form[@id='myform']");

Verwenden:

XmlNode s = f.SelectSingleNode(".//input[@type='submit']");

Dies hängt vom verwendeten Tool ab. Aber .// wählt jedes Kind und jede Tiefe aus einem Referenzknoten aus.

sk
quelle
Funktioniert gut in Powershell mit dem Befehl SelectSingleNode auf einem bestimmten XML-Knoten, der zuvor extrahiert wurde.
Gizmo3399
9
//form/descendant::input[@type='submit']
luis lang
quelle
6
füge eine Beschreibung hinzu.
Piyushj
0

Sie können dies auch mit CSS-Selektoren tun:

form#myform input[type='submit']

Leerzeichen zwischen Elementen in CSS-Wähler bedeutet, dass die Eingabe [type = 'submit'] nach Elementen in einer beliebigen Tiefe des übergeordneten Formulars # myform element durchsucht wird

Mahsum Akbas
quelle