Angenommen, ich habe folgendes (vereinfacht):
<form id="myform">
<!-- some input fields -->
<input type="submit" value="proceed"/>
</form>
Dann kann ich den Submit-Button per XPath //form[@id='myform']/input[@type='submit']
auswählen. Großartig.
Meine Vorlagen können sich jedoch ändern, und ich möchte in der Tiefe, in der sich die Schaltfläche zum Senden befindet, flexibel sein. Es könnte wie folgt in eine Tabelle 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 Grand-Grand-Grand -...-Kinder von großer 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 Enkelkinder, keine weiteren oder weniger Tiefen aus.//form[@id='myform']/**/input[@type='submit']
ist nicht gültig.Wie wähle ich diese Schaltfläche zum Senden zuverlässig aus, ohne Element-IDs zu verwenden?
Du bist fast da. Verwenden Sie einfach:
//form[@id='myform']//input[@type='submit']
Die //
-Verknüpfung kann auch innerhalb eines Ausdrucks verwendet werden.
Wenn Sie XmlDocument und XmlNode verwenden.
Sagen:
XmlNode f = root.SelectSingleNode("//form[@id='myform']");
Benutzen:
XmlNode s = f.SelectSingleNode(".//input[@type='submit']");
Es hängt von dem verwendeten Werkzeug ab. Aber .// wählt jedes Kind und jede Tiefe aus einem Referenzknoten aus.
//form/descendant::input[@type='submit']
Sie können dies auch mit css-Selektoren tun:
form#myform input[type='submit']
leerzeichen zwischen Elementen im CSS-Selektor bedeutet das Suchen der Eingabe [type = 'submit'], die Elemente in einer beliebigen Tiefe des übergeordneten Formulars # myform -Element enthalten