Какой правильный XPath для выбора атрибутов, содержащих «foo»?

133

Учитывая этот XML, XPath возвращает все элементы, атрибут prop содержит Foo (первые три узла):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
  • 1
    Почему все смотрят на атрибут "проп"? Я что-то пропустил? Это просто говорит получить первые три узла.
  • 4
    Все смотрят на атрибут проп, потому что это то, что спросили. Получить все узлы, где проп содержит "Foo". Добавьте <a prop="Foo5" /> и вы поймете, почему это не просто «первые три узла» ..
Показать ещё 4 комментария
Теги:
xpath

9 ответов

265
Лучший ответ
//a[contains(@prop,'Foo')]

Работает, если я использую этот XML, чтобы получить результаты обратно.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Изменение: Еще одна вещь, которую следует отметить, что хотя XPath выше вернет правильный ответ для этого конкретного XML, если вы хотите гарантировать, что вы получите только элементы "a" в элементе "бла", вы должны, как и другие упоминали, также использовать

/bla/a[contains(@prop,'Foo')]

Это будет искать вас всех элементов "а" во всем документе XML, независимо от того, были ли вложены в элемент "бла"

//a[contains(@prop,'Foo')]  

Я добавил это ради тщательности и в духе stackoverflow. :)

  • 3
    xmlme.com теперь перенаправляет на какой-либо другой хост и, по-видимому, не размещает инструмент или что-то подобное.
20

Этот XPath предоставит вам все узлы, у которых есть атрибуты, содержащие "Foo", независимо от имени или имени node:

//attribute::*[contains(., 'Foo')]/..

Конечно, если вас больше интересует содержимое самого атрибута, а не обязательно их родительский node, просто отпустите /..

//attribute::*[contains(., 'Foo')]
  • 0
    лучший универсальный ответ
  • 0
    Для всех узлов //@*[contains(., 'Foo')]
14
descendant-or-self::*[contains(@prop,'Foo')]

Или:

/bla/a[contains(@prop,'Foo')]

Или:

/bla/a[position() <= 3]

расчлененный:

descendant-or-self::

The Axis - поиск через каждый node снизу и сам node. Часто бывает лучше сказать это, чем //. Я столкнулся с некоторыми реализациями, где//означает где угодно (decendant или self of root node). Другие используют ось по умолчанию.

* or /bla/a

Тег - подстановочный знак и /bla/a - абсолютный путь.

[contains(@prop,'Foo')] or [position() <= 3]

Условие в []. @prop является сокращением для атрибута:: prop, поскольку атрибутом является другая ось поиска. В качестве альтернативы вы можете выбрать первые 3, используя функцию position().

5

John C является самым близким, но XPath чувствителен к регистру, поэтому правильным XPath будет:

/bla/a[contains(@prop, 'Foo')]
4

Если вам также необходимо сопоставить содержимое самой ссылки, используйте текст():

//a[contains(@href,"/some_link")][text()="Click here"]

4

Вы пробовали что-то вроде:

//a [содержит (@prop, "Foo" )]

Я никогда раньше не использовал функцию contains, но подозреваю, что он должен работать как рекламируемый...

  • 0
    @toddk ... вы указали несуществующий атрибут: @foo. Вы хотите настроить таргетинг на @prop ;-)
2

/bla/a [содержит (@prop, "foo" )]

1

попробуйте следующее:

//а [содержит (@проп, 'Foo')]

который должен работать для любых тегов "a" в документе

1

Для кода выше... // * [содержит (@prop, 'foo')]

  • 0
    это для любого элемента с foo in, но атрибут должен быть "prop"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню