Выберите элемент XML независимо от уровня с XPATH - PullRequest
15 голосов
/ 27 января 2011

У меня есть это:

<a>
  <b>
    <t>text</t>
  </b>
</a>
<a>
  <t>text</t>
</a>

Поэтому я хочу выделить текст независимо от того, где он находится. (обратите внимание, что это может быть где угодно, а не только на 1/2 уровня, например, у него не может быть родителей)

Возможно ли это?

Ответы [ 4 ]

24 голосов
/ 27 января 2011

Вы ищете ось descendant :

ось descendant содержит потомков узла контекста;потомок - это ребенок или ребенок от ребенка и т. д .;таким образом, ось потомка никогда не содержит узлов атрибута или пространства имен

В вашем случае: /descendant:t

Конечно, как ответили другие, для этого существует сокращенный синтаксис:

// - это сокращение от /descendant-or-self::node()/.Например, //para является сокращением от /descendant-or-self::node()/child::para и поэтому выберет любой элемент para в документе (даже элемент para, который является элементом документа, будет выбран //para, так как узел элемента документа являетсядочерний узел корневого узла)

21 голосов
/ 27 января 2011

Вы можете использовать //, чтобы выбрать все узлы из текущего узла.Так что //text() выберет все текстовые узлы.

Если бы вы хотели все t элементов, вы бы сделали //t.Если вы хотите сделать все элементы t из определенной точки, вы можете сделать /x/y//t.

7 голосов
/ 27 января 2011

просто //t, если вы хотите все <t> теги

1 голос
/ 05 августа 2014

W3Schools предлагает действительно хорошие бесплатные курсы по всему, что связано с HTML. Я настоятельно рекомендую прочитать это и сделать примеры. http://www.w3schools.com/xsl/xpath_syntax.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 и вернуться на несколько уровней, пока вы не сможете достичь span , в котором содержится дата публикации.

//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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...