webentwicklung-frage-antwort-db.com.de

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

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?

74
gertvdijk

Du bist fast da. Verwenden Sie einfach:

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

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

120
nwellnhof

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.

9
s k
//form/descendant::input[@type='submit']
7
luis long

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

0
Mahsum Akbas