Ответ 1
Ты почти там. Просто используйте:
//form[@id='myform']//input[@type='submit']
Ярлык //
также может использоваться внутри выражения.
Предположим, что у меня это (упрощенное):
<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>
Я знаю, что я могу выбрать элементы, которые являются внуками, но я не могу выбрать гранд-гранд-гранд -... любой глубины. Например:.
//form[@id='myform']/*/input[@type='submit']
выбирает только грандов-детей, дальнейших глубин.//form[@id='myform']/*/*/input[@type='submit']
выбирает только grand-grand-children, без дальнейших или меньших глубин.//form[@id='myform']/**/input[@type='submit']
недействителен.Итак, как я могу правильно выбрать эту кнопку отправки без использования идентификаторов элементов?
Ты почти там. Просто используйте:
//form[@id='myform']//input[@type='submit']
Ярлык //
также может использоваться внутри выражения.
Если вы используете XmlDocument и XmlNode.
Скажи:
XmlNode f = root.SelectSingleNode("//form[@id='myform']");
Использование:
XmlNode s = f.SelectSingleNode(".//input[@type='submit']");
Это зависит от используемого вами инструмента. Но.//выберет любой ребенок, любую глубину из ссылки node.
//form/descendant::input[@type='submit']