XPathを使用して深度の子要素を選択するにはどうすればよいですか?


101

私がこれを持っているとしましょう(簡略化されています):

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

次に、XPathで送信ボタンを選択します//form[@id='myform']/input[@type='submit']。すごい。

ただし、テンプレートが変更される可能性があり、送信ボタンが配置されている深さで柔軟にしたいと考えています。次のように、テーブルに入れることができます。

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

孫である要素を選択できることは知っていますが、どの深さのgrand-grand-grand -...- childerenも選択できません。例えば:

  • //form[@id='myform']/*/input[@type='submit'] 孫だけを選択し、それ以上の深さは選択しません。
  • //form[@id='myform']/*/*/input[@type='submit'] 孫孫のみを選択し、それ以上またはそれ以下の深さは選択しません。
  • //form[@id='myform']/**/input[@type='submit'] 有効ではない。

では、要素IDを使用せずにこの送信ボタンを確実に選択するにはどうすればよいですか?

回答:


157

あと少しです。単に使用してください:

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

//ショートカットはまた、式の中で使用することができます。


C#はこの表記を理解していないようです。//form//inputC#ではnullを返しますが、Chromeは同じxpathを使用して35個の入力を検出できます
Achilles

1
私の最後のコメントはここで議論されていますstackoverflow.com/questions/23232671/...
アキレス

14

XmlDocumentおよびXmlNodeを使用している場合。

いう:

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

使用する:

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

使用するツールによって異なります。しかし、。//は、参照ノードから任意の子、任意の深度を選択します。


以前に抽出した特定のXMLノードでSelectSingleNodeコマンドを使用して、Powershell内で適切に機能します。
Gizmo3399


0

また、CSSセレクターでそれを行うことができます:

form#myform input[type='submit']

css electorの要素の間のスペースは、親form#myform要素の深さでその要素をinput [type = 'submit']で検索することを意味します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.