Reputation: 761
To improve performance, I would like to perform getElementsByTagName("td") without having it search the entire document. Is there a way to narrow the scope searching for these elements? Here is my code:
$ie.Document.getElementsByTagName("td") | ? {($_.className -match 'NodeDocument')
The problem with this is that it takes over 10 minutes to return the results and I would like to narrow the scope of what is searched so it goes faster and doesn't return unwanted elements.
As an example, I only want to search for the highlighted elements in the image below, and not within the folders above an beneath. Is there a way to specify to only look within the 'Conventional' folder?
Any and all help is appreciated. Thank you.
Thanks for the replies, I will try to implement XPath. For what its worth, here is a screenshot of the HTML. #1 is the element of the 'Conventional' Folder. #2 is the first document element within the folder.
Update: Tried Frodo's method of calling .getElementsByTagName() on the $conventional folder in Chrome inspector. Here is a screenshot of result:
Upvotes: 1
Views: 237
Reputation: 761
Solved. Instead of referencing the $conventional
folder (which I found out does not have the "td" NodeDocuments as children), I created a new $DocContainer
which points to a div element which DOES have the NodeDocuments as children:
$DocContainer = $conventional.parentNode.parentNode.parentNode.parentNode.nextSibling
Using this $DocContainer
I can now say:
$documents = $DocContainer.getElementsByTagName("td") | ? {($_.className -match 'NodeDocument')
Special thank you to Frode F. for giving me the thought to reference a new element which is actually the parent container.
For others with similar issues:
Take advantage of the chrome inspector / console to test where your elements are within the DOM tree. Chrome's built-in inspector / console is very powerful and can save a lot of time and hassle. Methods like .parentNode
, .nextSibling
, childNodes
are key for DOM traversal. Hope this helps.
Upvotes: 0
Reputation: 54931
How about locating the container-node first and search inside of that? That would limit you down to ex. 5 td
-nodes that needs to be filtered through where-object
and not 1000+ like you may have now.
$conventional = $ie.Document.getElementById('OurLibrary_LibTocUC$LandingPanel$toc1$ExpertTree1_nl_23')
$documents = $conventional.getElementsByTagName("td") | ? { $_.className -match 'NodeDocument' }
Upvotes: 3