首页新闻找找看学习计划

IHTMLElementCollection遍历效率问题

0
悬赏园豆:5 [已解决问题] 解决于 2013-12-05 16:33
代码如下,页面大概有100个A,查询第一个A大概是1秒左右,越往后时间越长,查询最后一个A的时间大概是20到30秒.
刚开始用的for循环,效率跟这个一样.
HTMLDocumentClass obj = (HTMLDocumentClass)doc;
IHTMLElementCollection IHEColl = obj.getElementsByTagName("A");
IEnumerable<IHTMLElement> EnHEColl = IHEColl.Cast<IHTMLElement>();
IHTMLElement he1 = EnHEColl.FirstOrDefault(p =>p.innerHTML!=null && p.innerHTML.Contains(SearchText));
怎么样才能提高效率呢?
王者永乐的主页 王者永乐 | 初学一级 | 园豆:29
提问于:2013-08-28 09:59
< >
分享
最佳答案
0

支持xpath查询吗?支持的话用xpath来查询遍历吧。

收获园豆:2
````` | 专家六级 |园豆:14268 | 2013-08-28 10:57

用xml的话确实会很快,但是我重点是要返回当点显示我所搜索文字对应的节点的IHTMLElement对象,如果用xml的话就只能是文本了吧,或者xml节点转IHTMLElement对象的办法我还没有找到

王者永乐 | 园豆:29 (初学一级) | 2013-08-28 11:05

@王者永乐: 那可以用正则 来首先得到节点名称 然后再来找。

比如 要查找的是内容为ttt的。<(\S*?)[^>]*>ttt</\1>

然后得到节点名称。再单独查这一部分的节点就行了。或者实用匹配的起始地址就能够很快的查到了。

````` | 园豆:14268 (专家六级) | 2013-08-28 11:33

@王者永乐: 当然如果支持xpath那就更快。

'//a[text()='ttt']'先得到位置,再拿上级节点。也就几行代码的事。

````` | 园豆:14268 (专家六级) | 2013-08-28 11:41
其他回答(1)
0

建议跟踪一下时间具体耗在哪里?obj.getElementsByTagName("A") 还是 p.innerHTML.Contains(SearchText)?

收获园豆:3
dudu | 园豆:39136 (高人七级) | 2013-08-28 10:23

文中提到,查询第一个A和查询最后一个A的时间不同,因为obj.getElementsByTagName("A")只执行一次,p.innerHTML.Contains(SearchText)执行多次,耗时应该是后者.每往后查询一个A,会多大概200毫秒左右.

支持(0) 反对(0) 王者永乐 | 园豆:29 (初学一级) | 2013-08-28 10:28

@王者永乐: 那就从p.innerHTML.Contains(SearchText)为什么要200ms下手

支持(0) 反对(0) dudu | 园豆:39136 (高人七级) | 2013-08-28 10:33

@dudu: 嗯,思路是这样的,

支持(0) 反对(0) 王者永乐 | 园豆:29 (初学一级) | 2013-08-28 11:06

@dudu: 写了一个空循环,速度还是这样子,放弃了.换思路.

支持(0) 反对(0) 王者永乐 | 园豆:29 (初学一级) | 2013-08-28 11:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册