Как я могу сопоставить любой из двух элементов в части запроса XPath - PullRequest
0 голосов
/ 10 декабря 2018

Я использую php DOMXPath для запроса привязки и хочу сопоставить любой из двух элементов.В настоящее время я делаю это с помощью трубы или условия:

//div[@class="wrapper"]//div[@class="target"]/a | //div[@class="wrapper"]//li[@class="target"]/a

Это работает.Я также попробовал это (как обрисовано в общих чертах здесь ):

//div[@class="wrapper"]//*[self::div or self::li][@class="target"]/a

Хотя этот работает , он кажется неэффективным, поскольку использует подстановочный знак для запроса каждого элементаи затем фильтрует их по факту.

Чтобы быть более кратким, мне интересно, можно ли сократить мой исходный запрос так, чтобы мое условие | применялось только к определенной части, вместо повторения всего запроса,Я думал, что смогу сделать что-то подобное, но выдает ошибку DOMXPath::query(): Invalid expression:

//div[@class="wrapper"]//(div|li)[@class="target"]/a

Возможно ли это с правильным синтаксисом или мне нужно явно указывать полный путь для каждого условия

1 Ответ

0 голосов
/ 10 декабря 2018

//div[@class="wrapper"]//(div|li)[@class="target"]/a является действительным XPath 2.0 выражением, но не XPath 1.0 .Ваш движок PHP, вероятно, будет переведен на XPath 1.0 .

Если вы беспокоитесь о производительности вашего второго XPath //div[@class="wrapper"]//*[self::div or self::li][@class="target"]/a, первый профиль и показатель, чтобы увидеть, работает ли он в пределахдопустимые диапазоны.Вы можете обнаружить, что он работает достаточно хорошо или так же, как ваш первый пример, и что вам не нужно беспокоиться о разнице.

В качестве альтернативы, которую можно также протестировать и измерить производительность, можно переместить предикат, ограничивающий элементы, у которых атрибут класса равен «target», до того, как предикат протестирует элементы div или li:

//div[@class="wrapper"]//*[@class="target"][self::div or self::li]/a

или объедините их в один предикат:

//div[@class="wrapper"]//*[@class="target" and (self::div or self::li)]/a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...