2009-10-01 5 views
2

Je fais un tas de document.evaluate puis je répète chaque résultat avec une boucle for sur result.snapshotLength.Fusion de XPathResults à partir de document.evaluate

Puisque je fais la même chose à l'intérieur de chaque boucle (un thisDiv.parentNode.removeChild) je voudrais faire une seule boucle.

J'ai lu que:

Le cinquième paramètre peut être utilisé pour fusionner les résultats de deux requêtes XPath . Passez dans le résultat d'un précédent appel à document.evaluate, et il retournera les combinés résultats des deux requêtes

J'essayé:

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); 

Mais cela ne fonctionne pas (bien que je n'ai pas de journal des erreurs, ça ne marche tout simplement pas).

Quelle est la bonne façon de procéder? Puis-je exécuter différentes requêtes XPath et fusionner les résultats? Ou existe-t-il un moyen de transmettre des expressions régulières ou une sorte d'alternance à la requête elle-même?

Le code que j'ai pour est maintenant à: http://userscripts.org/scripts/review/58939

Merci pour votre aide!

+0

'J'ai lu ceci: Le cinquième paramètre peut être utilisé pour fusionner les résultats de deux requêtes XPath. 'Yup, c'est certainement [supposé être le cas] (http://help.dottoro.com/ljruhkuj. php). Malheureusement, trouver un exemple d'utilisation s'avère difficile. 'Mais cela ne marche pas (bien que je n'ai pas de journal des erreurs, ça ne marche pas). 'Qu'est-ce qui s'est exactement passé? L'objet de résultats contenait-il uniquement le premier ensemble? Seulement le deuxième ensemble? Était-ce vide? (Évidemment la question est morte, mais je demande de futurs lecteurs.) – Synetech

Répondre

1

Vous pouvez simplifier votre XPath dans le userscript et rejoindre simples expressions avec "|":

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

ou encore mieux dans une expression des conditions severel:

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

Quant à votre exemple ci-dessus , iirc la deuxième requête ne trouverait que des correspondances, si le résultat de la première requête les contenait, c'est-à-dire si //div[@class='class name 2'] où les enfants des nœuds résultants de la première requête //div[@class='class name 2'].

+0

merci beaucoup c'est assez cool! la syntaxe ne me semble pas super claire, avec l'instruction ou à l'intérieur des guillemets doubles;) –

+0

C'est juste la fente de la chaîne sur plusieurs lignes de readablity (je pensais: -O), si vous voulez, vous pouvez faire le tout expression dans une chaîne. –

+0

J'ai essayé la deuxième méthode (condition combinée), mais cela ne fonctionnerait pas dans une extension Chrome (une condition ne retournerait jamais, que je la mette en premier ou en second). L'utilisation de la première méthode avec des expressions séparées a parfaitement fonctionné. Merci! (Bien que je serais toujours intéressé de savoir s'il existe un moyen de fusionner plusieurs XPathResults depuis que j'ai lu cela alors qu'ils se comportent comme des tableaux, ils ne sont pas des tableaux techniques et n'incluent pas beaucoup de tableau standard fonctionnalité, de sorte que les moyens évidents ne fonctionneraient pas.) – Synetech