Я думаю, у меня есть решение, которое не требует иметь дело с пространствами имен.
Вот один, который выбирает все соответствующие ДИВ-х:
//div[@id[starts-with(.,"post_message")]]
Но вы сказали, что вы хотели только «первый» (я предполагаю, что вы имеете в виду первый «удар» по всей странице?). Вот небольшая модификация, которая выбирает только первый результат согласования:
(//div[@id[starts-with(.,"post_message")]])[1]
Они используют точку, чтобы представлять значение идентификатора в пределах функции starts-with()
. Возможно, вам придется скрывать специальные символы на вашем языке.
Он отлично работает для меня в PowerShell:
# Load a sample xml document
$xml = [xml]'<root><div id="post_message_somenumber"/><div id="not_post_message"/><div id="post_message_somenumber2"/></root>'
# Run the xpath selection of all matching div's
$xml.selectnodes('//div[@id[starts-with(.,"post_message")]]')
Результат:
id
--
post_message_somenumber
post_message_somenumber2
Или, только первый матч:
# Run the xpath selection of the first matching div
$xml.selectnodes('(//div[@id[starts-with(.,"post_message")]])[1]')
Результат:
id
--
post_message_somenumber
Хороший вопрос, +1. См. Мой ответ для двух возможных причин проблемы и решения. –
Проблема связана с кавычками и (возможно, вторично) значением 'id' (он не начинается с двойной кавычки). Вы хотите что-то вроде 'xpath = '// div [start-with (@id," post_message _ ")]'' – salathe
Я не знаю, что такое yql, но я подозреваю, что проблема связана с тем, как вы пишете выражение XPath, содержащее кавычки, а затем вставлять его или скрывать в среде вашего языка. –