2009-10-01 1 views
2

Я делаю кучу document.evaluate, затем повторяя каждый результат с помощью цикла for на result.snapshotLength.Слияние XPathРезультаты из document.evaluate

Поскольку я делаю то же самое внутри каждого цикла (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

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

+0

'Я читал это: пятый параметр может использоваться для объединения результатов двух запросов XPath.« Да, это, безусловно, [должно быть так] (http://help.dottoro.com/ljruhkuj. PHP). К сожалению, найти пример использования затруднительно. 'Но это не работает (хотя у меня нет журнала ошибок, он просто не работает). Что именно произошло? Объект результатов содержит только первый набор? Только второй сет? Было ли это пусто? (Очевидно, вопрос мертв, но я прошу будущих читателей.) – Synetech

ответ

1

Вы можете упростить XPath в userscript и присоединиться одиночные выражения с «|»:

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

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

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

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

+0

большое спасибо, это довольно круто! Синтаксис не кажется мне более ясным, с выражением или внутри двойных кавычек;) – 2009-10-01 11:38:25

+0

Это просто строка, разбитая на несколько строк для удобочитаемости (я думал: -O), если хотите, вы можете сделать все выражение в одной строке. –

+0

Я попробовал второй метод (комбинированное условие), но он просто не работал бы в расширении Chrome (одно условие всегда не возвращалось бы независимо от того, поставил ли я его первый или второй). Использование первого метода с отдельными выражениями отлично работало. Благодаря! (Хотя мне все равно было бы интересно узнать, есть ли способ слить несколько «XPathResults», так как я читал, что, когда они ведут себя так же, как массивы, они не являются технически массивами и не включают много стандартного массива функциональность, поэтому очевидные способы не будут работать.) – Synetech