DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: Bizrusthelf
今日帖子: 7
在线用户: 31
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 coater (coater) ▲▲▲▲△ -
注册会员
2018/3/31 13:14:38
标题:
请教一个遍历node的问题 浏览:319
加入我的收藏
楼主: //获取网页的NODE
function GetNodeByName( MYParentIHTMLDOMNode: mshtml.IHTMLDOMNode;NodeNamestr,NameStr,TheValue:string;AllorPart:boolean):mshtml.IHTMLDOMNode;
var
Mystr:string;   
MyIHTMLDOMNode : mshtml.IHTMLDOMNode;
i,j:integer;
MyIHTMLDOMAttribute: mshtml.IHTMLDOMAttribute2 ;
begin


  for  i:=0 to ((MYParentIHTMLDOMNode.childNodes) as mshtml.IHTMLDOMChildrenCollection).length-1 do
  begin
    MyIHTMLDOMNode:=(MYParentIHTMLDOMNode.childNodes as mshtml.IHTMLDOMChildrenCollection).item(i) as mshtml.IHTMLDOMNode ;
     if assigned(GetNodeByName(MyIHTMLDOMNode,NodeNamestr,NameStr,TheValue,AllorPart)) then
       begin
         result:=GetNodeByName(MyIHTMLDOMNode,NodeNamestr,NameStr,TheValue,AllorPart);
        exit;
       end;
    if (ansiuppercase(MyIHTMLDOMNode.nodeName)=ansiuppercase(NodeNamestr)) then
    if assigned(MyIHTMLDOMNode.attributes) then
    for j :=0 to (MyIHTMLDOMNode.attributes  as mshtml.IHTMLAttributeCollection).length-1  do
       begin
          MyIHTMLDOMAttribute:=(MyIHTMLDOMNode.attributes  as mshtml.IHTMLAttributeCollection) .item(j) as mshtml.IHTMLDOMAttribute2;
          Mystr:=MyIHTMLDOMAttribute.name;
          Mystr:=MyIHTMLDOMAttribute.value;
          if( ansiuppercase(MyIHTMLDOMAttribute.name)=ansiuppercase(NameStr)) and
          ((ansiuppercase(MyIHTMLDOMAttribute.value)=ansiuppercase(TheValue)) or
          (ansipos(ansiuppercase(TheValue),ansiuppercase(MyIHTMLDOMAttribute.value))<>0) and AllorPart ) then
          begin
          result:=MyIHTMLDOMNode;
          exit;
          end;
       end;

  end;

end;


--------可以正确得到结果,但是总觉得不对劲啊!
注:
1.如果 result:=GetNodeByName(MyIHTMLDOMNode,NodeNamestr,NameStr,TheValu)
中不加result,单单使用 exit那个result也不能得到正确结果。

使用下面范例不能得到正确结果
while node<>nil do
    begin
      if node.HasChildren then
...
      if node.getNextSibling<>nil then
        node:=node.getNextSibling
----------------------------------------------
-
作者:
男 coater (coater) ▲▲▲▲△ -
注册会员
2018/9/6 20:53:35
1楼: Function ProcessNode(ANode: ICefDomNode):string;
var
  Node1: Node;
begin
if Assigned(ANode) then begin
    Node1 := ANode.FirstChild;
    while Assigned(Node1) do
     begin
       if Node1.IsElement then
        if Node1.GetElementAttribute('id') ='kw' then
         begin
          result:=Node1.AsMarkup;
          exit
         end;
          ProcessNode(Node1);
      Node1 := Node1.NextSibling;
     end;
end;
end;

----------
这个问题一直困扰我这个菜鸟啊,debug中间会得到正确的result可是函数最终却不能得到正确值
----------------------------------------------
-
作者:
男 coater (coater) ▲▲▲▲△ -
注册会员
2018/9/13 20:41:53
2楼: 在不使用全局变量的情况下可以这么搞,哈哈
Function ProcessNode(ANode: ICefDomNode;var Theresult:ustring):ustring;
var
  Node1: ICefDomNode;
begin
result:='';
if Assigned(ANode) then begin
    Node1 := ANode.FirstChild;
    while Assigned(Node1) do
     begin
       if Node1.IsElement then
        if Node1.GetElementAttribute('id') ='kw' then
         begin
          MyGetTXT:=Node1.AsMarkup;
          Theresult:=Node1.AsMarkup;
          result:=MyGetTXT;
          GetTheNode:=true;
          exit;
         end;
      ProcessNode(Node1,Theresult);
      Node1 := Node1.NextSibling;
     end;
  end;
end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行31.25毫秒 RSS