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

Я делаю кучу 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

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


person Community    schedule 01.10.2009    source источник
comment
I've read that : The fifth parameter can be used to merge the results of two XPath queries. Да, это, безусловно, должно быть так. К сожалению, найти пример использования оказывается сложно. But this doesn't work (although i don't have an error log, it just doesn't work). Что именно произошло? Объект результатов содержал только первый набор? Только второй комплект? Он был пуст? (Очевидно, что вопрос мертв, но я прошу будущих читателей.)   -  person Synetech    schedule 07.07.2014


Ответы (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'].

person andre-r    schedule 01.10.2009
comment
спасибо большое это очень круто! синтаксис не кажется мне супер ясным, с оператором or внутри двойных кавычек;) - person ; 01.10.2009
comment
Это просто строка, разделенная на несколько строк для удобочитаемости (я думал :-O), если хотите, вы можете сделать все выражение в одной строке. - person andre-r; 01.10.2009
comment
Я пробовал второй метод (комбинированное условие), но он просто не работал в расширении Chrome (одно условие всегда не возвращалось, независимо от того, поставил я его первым или вторым). Использование первого метода с отдельными выражениями работало отлично. Спасибо! (Хотя мне все равно было бы интересно узнать, есть ли способ объединить несколько XPathResults, поскольку я читал, что, хотя они во многом похожи на массивы, технически они не являются массивами и не включают в себя множество стандартных функций массива, поэтому очевидные способы не сработают.) - person Synetech; 07.06.2014