Выберите элемент XML независимо от уровня с помощью XPATH
У меня есть это:
<a>
<b>
<t>text</t>
</b>
</a>
<a>
<t>text</t>
</a>
Поэтому я хочу выбрать текст независимо от того, где он.
(обратите внимание, что он может быть где угодно не ровно на 1/2 уровня вниз, у него могут не быть родителей, например)
Возможно ли это?
Ответы
Ответ 1
Вы ищете ось descendant
:
ось descendant
содержит потомки контекста node; потомок - ребенок или ребенок ребенок и т.д.; таким образом, потомок ось никогда не содержит атрибута или узлы пространства имен
В вашем случае: /descendant:t
Конечно, как ответили другие, для этого есть сокращенный синтаксис:
//
не подходит для /descendant-or-self::node()/
. Для Например, //para
не подходит для /descendant-or-self::node()/child::para
и поэтому выберет любой элемент para
в документе (даже элемент para
это элемент документа, который будет выбранный //para
, поскольку элемент документа node является дочерним элементом корень node)
Ответ 2
Вы можете использовать //
для выбора всех узлов из текущего node. Таким образом, //text()
будет выбирать все текстовые узлы.
Если вы хотите, чтобы все t элементов выполнялись //t
. Если вы хотите сделать все t
элементы из определенной точки, вы можете сделать /x/y//t
.
Ответ 3
just //t
, если вы хотите, чтобы все теги <t>
Ответ 4
В W3Schools действительно хорошие бесплатные курсы по всему, что связано с HTML.
Я настоятельно рекомендую прочитать это и сделать примеры.
https://www.w3schools.com/xml/xpath_intro.asp
СОВЕТ: вы можете использовать консоль браузера для оценки выражений. В разделе "Инструменты разработчика" - клавиша F12 для Chorme и Firefox:
$x('<your expressions>');
Итак, как все говорили, вы можете использовать синтаксис //
, чтобы найти элемент в любом месте страницы.
например //a
вернет вам все элементы a
на странице.
Скорее всего, вы захотите конкретный, так что там, где вы используете предикаты. Они заключены в квадратные скобки.
Используя эту страницу в качестве примера, вот xquery:
//a[text()="Simeon"]
Этот xpath вернет все элементы a
, для которых в качестве текста указан Симеон.
Во многих ситуациях вам может потребоваться улучшить свой xpath, чтобы включить больше идентификаторов, а точнее.
//a[text()="Simeon" AND @href="/users/274344/simeon"]
Таким образом, вы можете использовать практически любой атрибут HTML или даже CSS для определения нужного вам узла.
Но теперь, давайте возьмем это на ступеньку выше.
Допустим, вы хотите получить элемент a
, который находится ниже ответа пользователя mkimd от 27 января.
Если вы посмотрите на эту структуру страницы, вы должны получить a
и вернуться на несколько уровней, пока не сможете достичь промежутка, в котором содержится дата публикации.
//a[text()="mkimd" AND ../../div[@class="user-action-time"]/span[contains(.,"Jan")]]
Есть много способов выполнить эти запросы, последний пример, который я привел, может быть реализован с помощью различных xqueries.
Я обнаружил, что xqueries очень похожи на навигацию в каталогах в консоли, например, в Linux BASH - относительные и абсолютные пути, а идентификаторы похожи на предложения SQL WHERE
.
Если вы исследуете, есть много функций, доступных в синтаксисе XPATH, таких как
- в нижнем регистре()
- верхний регистр()
- CONCAT()
- концы-с()
- операторы (
+
, -
, *
, div
, !=
, <
, <=
, >
,...)
Я настоятельно советую вам использовать какой-либо инструмент, например Firefox Firefug FirePath addon, чтобы попрактиковаться в xquery и проверить, получаете ли вы нужный элемент - он выделяет найденные элементы.
====================
ОБНОВЛЕНИЕ - 8-15 мая
Если вы используете Xpath в автоматизации Selenium, знайте, что это не поможет вам выбрать псевдоэлементы CSS.