首页 > 其他分享 >GeckoFx (4)使用 treeview 展示 dom 数树

GeckoFx (4)使用 treeview 展示 dom 数树

时间:2022-10-28 14:32:31浏览次数:57  
标签:node 数树 dom element var rNode GeckoFx attrStr null


GeckoFx (4)使用 treeview 展示 dom 数树
使用 DocumentCompleted 事件,在页面加载完成后构建一个 dom 树使用 treeview 控件。
treeHtml: treeview 控件;
browser:Gecko.GeckoWebBrowser 控件;


注册事件:

browser.DocumentCompleted += browser_DocumentCompleted;


/// <summary>
/// 文档加载完成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void browser_DocumentCompleted(object sender, Gecko.Events.GeckoDocumentCompletedEventArgs e)
{
ShowHtmlTree();
}

/// <summary>
/// 构建dom树
/// </summary>
private void ShowHtmlTree()
{
this.treeHtml.Nodes.Clear();
var domRoot = browser.DomDocument;
StringBuilder attrStr = new StringBuilder();
Func<GeckoNode, string> getTag = (node) =>
{
attrStr.Clear();
if (node.NodeName.Equals("STYLE") ||
node.NodeName.Equals("SCRIPT"))
{
return string.Format("<{0}>...</{0}>",node.NodeName.ToLower());
}
//var element = node as GeckoHtmlElement;
string innerText = string.Empty;
GeckoElement element = node.GetEventTarget().CastToGeckoElement();
//
if (element != null &&
element.ChildNodes.Count()==1 &&
element.ChildNodes[0].NodeType == NodeType.Text)
{
innerText = element.TextContent;
}
attrStr.AppendFormat("<{0}", node.NodeName.ToLower());
//构建属性
if (node.HasAttributes && element != null)
{
foreach (var attr in element.Attributes)
{
attrStr.Append(
string.Format(" {0}=\"{1}\"", attr.NodeName, attr.NodeValue));
}
}
//内容
attrStr.AppendFormat(">{0}</{1}>", innerText, node.NodeName.ToLower());
return attrStr.ToString();
};
//递归构建树
Func<GeckoNode, TreeNode> buildTree = null;
buildTree = (rNode) =>
{
if (rNode == null)
return null;
TreeNode tnode = new TreeNode()
{
Text = getTag(rNode),
Tag = rNode
};
if (rNode.ChildNodes == null || !rNode.ChildNodes.Any())
return null;
foreach (var cNode in rNode.ChildNodes)
{
var ctnode = buildTree(cNode);
if (ctnode != null)
tnode.Nodes.Add(ctnode);
}
return tnode;
};
var treeRoot = buildTree(domRoot);
if (treeRoot!=null)
this.treeHtml.Nodes.Add(treeRoot);
this.treeHtml.ExpandAll();
}



标签:node,数树,dom,element,var,rNode,GeckoFx,attrStr,null
From: https://blog.51cto.com/u_4518216/5804867

相关文章

  • GeckoFx (2)向已加载的页面中注入 css 和 js
    向已加载的页面中注入js、css,在页面加载完后执行自定义的脚本,点击页面元素展示修改元素的边框颜色。使用browser_Load事件在页面加载完成时注入......
  • L:python基础知识:数学运算函数,字符串内置函数,math数学模块,random随机模块,datetim
    数学运算函数asb(x)返回绝对值divmod(x,y)返回一个(x//y,x%y)的元组,可以用两个变量来接收它max(seq),min(seq)返回seq序列的最大值,最小值pow(x,y)返回x的y次方round(x,p......
  • 9,dom
    DOMDOM全称(documentobjectmodel)文档对象模型(文档指定为对应html文档),对应的DOM就是操作HTML文档的(增删改查)document文档对象1.获取全局的内容document.getElementBy......
  • DOM
    概念DOM:文档对象模型,是一套标准的编程接口,可以通过DOM来操作html元素js操作DOM元素浏览器加载html的时候,会根据html的结构体形成一颗DOM树,dom树上有元素节点、属性节点......
  • D. Problem with Random Tests
    传送门题意:给出一个字符串,然后,从这个字符串中取两个子串s1,s2,要求两个字符串的或最大思路:首先,先去s1从第一个非0开始取整段,记录第一个非0的位置为p1,因为或位数......
  • LeetCode_LinkedList_138. Copy List with Random Pointer 复制带随机指针的链表(C++)【
    目录​​一,题目描述​​​​英文描述​​​​中文描述​​​​二,解题思路​​​​三,AC代码​​​​C++​​​​四,解题过程​​​​第一博​​一,题目描述英文描述Alinkedli......
  • HTMLDOM_innerHEML、样式控制
    HTMLDOM_innerHEMLHTMLDOM1.标签体的设置和获取:innerHTML2.使用html元素对象的属性3.控制元素样式使用元素的style属性来设置如://修改样式......
  • 636 自动跳转首页_案例 and 637 DOM概念
    自动跳转首页_案例分析:1.显示页面效果 <p>2.倒计时读秒效果实现2.1定义一个方法,获取span标签,修改span标签体内容,时间--2.2......
  • element表格el-table组件实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题
    element表格el-table组件实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题当页面数据过多,前端渲染大量的DOM时,会造成页面卡死问题,使用分页或则懒加载这些方案也无法解决,这......
  • day09 DOM
    DOM的概述DOM是文档对象模型(documentobjectmodel),顾名思义就是用来操作对应的HTML文档的.它是一个遵从文档流的语句,是同步机制的.DOM的分类document是......