Выберите элемент 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.