XPath kullanarak herhangi bir derinlikteki alt öğeleri nasıl seçerim?


105

Şuna sahip olduğumu varsayalım (basitleştirilmiş):

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

Sonra XPath ile gönder düğmesini seçebilirim //form[@id='myform']/input[@type='submit']. Harika.

Ancak, şablonlarım değişebilir ve gönder düğmesinin bulunduğu derinlik konusunda esnek olmak istiyorum. Şöyle bir masaya konulabilir:

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

Torun olan öğeleri seçebileceğimi biliyorum, ancak herhangi bir derinlikteki büyük-büyük-büyük -...- çocukları seçemiyorum. Örneğin:

  • //form[@id='myform']/*/input[@type='submit'] sadece torunları seçer, daha fazla derinlik yoktur.
  • //form[@id='myform']/*/*/input[@type='submit'] sadece büyük torunları seçer, daha fazla veya daha az derinlik yoktur.
  • //form[@id='myform']/**/input[@type='submit'] geçerli değil.

Öyleyse, öğe kimliklerini kullanmadan bu gönder düğmesini güvenilir bir şekilde nasıl seçebilirim?

Yanıtlar:


165

Neredeyse oradasın. Basitçe şunu kullanın:

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

//Kısayol da bir ifade içinde kullanılabilir.


C # bu gösterimi anlamıyor gibi görünüyor. //form//inputC # içinde null döndürürken, Chrome aynı xpath'i kullanarak 35 giriş bulabilir
Achilles

1
Son yorumum burada tartışılıyor: stackoverflow.com/questions/23232671/…
Aşil

14

XmlDocument ve XmlNode kullanıyorsanız.

Söyle:

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

Kullanım:

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

Kullandığınız araca bağlıdır. Ancak .//, bir referans düğümünden herhangi bir derinlikte herhangi bir alt öğe seçecektir.


Daha önce çıkarılan belirli bir XML düğümünde SelectSingleNode komutunu kullanarak Powershell içinde iyi çalışır.
Gizmo3399


-3

Ayrıca, css seçicilerle de yapabilirsiniz:

form#myform input[type='submit']

css seçicisindeki öğeler arasındaki boşluk, üst formun herhangi bir derinliğindeki öğelerin girişini aramak anlamına gelir [type = 'submit'] # myform element

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.