


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、解析 Html 生成标签树解析 Html 生成标签树(一)2011 -04-01 09:10:24|分类:HTML | 标签:tag stack ilevel文本 htmltag | 字号大中小 订阅 解析 Html 成标签树结构以 后,我们不但可以很容易取得想要的元素,同时也很容 易 将 Html 转换成对应的 XML 文件。 但是由于代码是在公司写 的,所以没有粘贴出来的可能性,所以我只能给出大概的代 码流程,具体细节描述,相信各位都很 容易写出来,并且 写的比我好,关键的是算法实现思想。算法的关键如下:1. Html 中每个 tag 都是都将作为树中的一个节点存在的, 每 个 tag 都
2、属于树中的某一层。2. 辅助数据结构:栈( stack )、List、HashTable 。其中 HashTablei (i 属于 int 类型)是一个 Li st ,用于临时存储第 i 层子 Tag 。3. 顺序扫描Html文本,当遇到” 0) HtmlTag tag = null; while (Stack.Count 0) tag = Stack.Pop(); PopTag(tag); / 最后一个元素作为 根元素 if (tag != null) m_listRoot.Add(tag); private void PopTag(HtmlTag tag) int iLevel = Sta
3、ck.Count; / 找 到了元素,把 iLevel 到 m_IMaxLevel 中所有的元素按照全 部作为 tag 的子元素 for (int i = iLevel + 1; i m_iMaxLevel; i+) for (j = 0; j 0) / 将文本作为一 个普通 Tag 入栈 Stack.Push(new HtmlTextTag(m_CurrentText); HtmlTag tag =Stack.Pop(); / 元素出栈 int iLevel = Stack.Count; / 记录栈元素数 while (tag.Name != tagName) / 将 tag 放入第 iLe
4、vel 层的 List 中 HashTableiLevel.Add(tag); tag = Stack.Pop(); iLevel = Stack.Count; / 元素出栈后续处理 PopTag(tag); private HtmlTag GetTag() if (如果发现是= A) & (chiBeginPos = Index; / 记录开始位置/表示可能是一个标签HtmlTag tag = GetTag(); / 解析此 Tagif (tag != null)/首先判断是否有文本if (m_CurrentText.Lenght 0)/将文本作为一个普通 Tag 入栈 Stack.Push
5、(new HtmlTextTag(m_CurrentText);tag.BeginPos = iBeginPos; / 记录此 Tag 的开始位置 Stack.Push(tag); / 把 Tag 入栈ch = GetCurrentChar(); if (ch = /) /可能是结束标签 tagName = GetTagName(); /从上到下查看 Stack ,如果 Tag 中存在 if (FindInStack(tagName) /在栈中找到名为 tagName 的元素,则把找到的元素出栈 PopTag(tagName);else/对于 xxx 之间的文本 xxx ,这里将作为 Text
6、Tag 来处理 m_CurrentText.Append(GetCurrentChar();/继续处理下一个字符ch = MoveNext();/解析完成以后,如果栈不空,那么把元素出栈,并把最后 一次出栈的元素作为根if (Stack.Count 0)HtmlTag tag = null;while (Stack.Count 0)tag = Stack.Pop();PopTag(tag);/最后一个元素作为根元素 if (tag != null) m_listRoot.Add(tag); private void PopTag(HtmlTag tag)int iLevel = Stack.C
7、ount;/找到了元素,把 iLevel 到 m_IMaxLevel 中所有的元素按照 全部作为 tag 的子元素 for (int i = iLevel + 1; ifor (j = 0; j /表示栈已经为空,那么最后一次出栈的 tag 将作为根 if (Stack.Count = 0) m_listRoot.Add(tag);private void PopTag(string tagName)/* 元素出栈的时候,首先需要把当前已经存在了的 HtmlTextTag 入栈* 比如:文本段 1 文本段 2 文本段 3* 在 Parse 中,当解析出入栈前,需要先把 文本段 1 入栈* 在这
8、里,解析出了结束标志* 那么首先需要把 文本段 2 入栈。* 解析出则需要把 文本段 3 入栈。* 这样才能够保证 文本段 1 和 文本段 3 成为的子节点, 而 文本段 2 作为的子节点*/ if (m_CurrentText.Lenght 0)/将文本作为一个普通 Tag 入栈Stack.Push(new HtmlTextTag(m_CurrentText); HtmlTag tag = Stack.Pop(); / 元素出栈 int iLevel = Stack.Count; / 记录栈元素数while (tag.Name != tagName)/将 tag 放入第 iLevel 层的
9、List 中 HashTableiLevel.Add(tag);tag = Stack.Pop();iLevel = Stack.Count;/元素出栈后续处理 PopTag(tag);private HtmlTag GetTag() if (如果发现是SkipComment();HtmlTag tag = new HtmlTag();tag.Name = GetTagName();/这里的 Attribute 我将其作为 HashTable 类型, Hash 属性 名=属性值tag.Attribute = GetTagAttribute();return tag; 解析结束以后,通过访问 m_listRoot 就可以遍历出所有的 节点了。上面仅仅是给出了大概的方法,不过我相信要将上 面的方法转换成可运行代码,各位都是有这个能力的。 。解析 Html 生成标签树(二)2011-04-01 09:12:08| 分类: HTML | 标签:解析 div html td 阿道夫 |字号大中小 订阅前面两篇讲解了解析 Html
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人工智能导论 课件 第12章 数据挖掘与知识发现
- 装备制造业关键设备自主研发2025:自主创新能力提升与产业升级
- 吉林应援管理办法
- 名称授权管理办法
- 吴江养犬管理办法
- 员工学历管理办法
- 售电准入管理办法
- 商会考核管理办法
- 商品进货管理办法
- 商房租赁管理办法
- T-CPQS C010-2024 鉴赏收藏用潮流玩偶及类似用途产品
- NB-T10394-2020光伏发电系统效能规范
- (高清版)JTGT 5214-2022 在用公路桥梁现场检测技术规程
- A01食用菌生产概述
- ISO 15609-1 金属材料焊接工艺规程及评定-焊接工艺规范中文版
- 王川同教授:中国文学界的泰斗级人物
- 充电宝材料分析报告
- 风湿免疫疾病与心脑血管疾病的关系
- 仓库租赁合同主要条款
- 现代汉语语料库词频表CorpusWordlist
- 工厂仓管职责培训课件
评论
0/150
提交评论