Слияние XPathResults из document.evaluate - PullRequest
2 голосов
/ 01 октября 2009

Я делаю кучу документов. Затем выполняю итерацию каждого результата с циклом 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 Ответ

1 голос
/ 01 октября 2009

Вы можете упростить свой 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'].

...