Слияние XPathResults из document.evaluate

Я делаю кучу документов. Оцениваю, затем перебираю каждый результат с циклом for на result.snapshotLength,

Так как я делаю то же самое внутри каждого цикла (thisDiv.parentNode.removeChild) Я хотел бы сделать только один цикл.

Я прочитал это:

Пятый параметр можно использовать для объединения результатов двух запросов XPath. Передайте результат предыдущего вызова document.evaluate, и он вернет объединенные результаты обоих запросов

Итак, я попробовал:

comDivs = document.evaluate(
    "//div[@class='class name 1']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

ggDivs = document.evaluate(
    "//div[@class='class name 2']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    comDivs);

Но это не работает (хотя у меня нет журнала ошибок, он просто не работает).

Какой правильный способ сделать это? Могу ли я запустить разные запросы XPath и объединить результаты? Или есть способ передать регулярные выражения или какое-то чередование самого запроса?

Код, который у меня есть сейчас, находится по адресу: http://userscripts.org/scripts/review/58939

Спасибо за вашу помощь!

1 ответ

Решение

Вы можете упростить свой XPath в пользовательском сценарии и объединить отдельные выражения с помощью "|":

"//div[@class='reactionsCom reactionsNiv1 first'] | " + 
"//div[@class='googleBanner'] | " + 
"//div[@class='blocE1B-16b'] | " +
"//div[@class='blocE1B-16b clear']"

или даже лучше в одном выражении с некоторыми условиями:

"//div[@class='reactionsCom reactionsNiv1 first' or " +
      "@class='googleBanner' or " +
      "@class='blocE1B-16b' or " +
      "@class='blocE1B-16b clear']"

Как и в приведенном выше примере, iirc второй запрос найдет совпадения только в том случае, если результат первого запроса содержит их, т.е. если //div[@class='class name 2'] где дочерние элементы узлов результата из первого запроса //div[@class='class name 2'],

Другие вопросы по тегам