1、如果在栈中找到与此结束标志名同名的元素(此元素属 于栈中第iLevel层),那么表示找到匹配的Tag。则Tag出栈,将HashTableiLevel+1到 HashTablemaxLevel中的所有元素取出作为此Tag的子节点。放入第HashTable iLevel中。并记录Tag的结束位置。5. 对于xxx之间的字符串xxx,将其作为特殊的HtmlTextTag处理。出栈,和入栈操作与普通Tag类似。6. 当栈为空的时候表示最后一次出栈的Tag给根节点。 由于是在公司内部开发的东西,所以不可能把源代码拿出来粘贴,所以只能把大概的代码给出。伪代码如下:view plaincopy to cli
2、pboardprint?public void Parse() char ch = GetCurrentChar(); /取第一个字符 while (!Eof() if (ch = = A) & (ch 0) /将文本作为一个普通Tag入栈 Stack.Push(new HtmlTextTag(m_CurrentText); tag.BeginPos = iBeginPos; /记录此Tag的开始位置 Stack.Push(tag); /把Tag入栈 ch = GetCurrentChar(); if (ch = /) /可能是结束标签 tagName = GetTagName(); /从上到
3、下查看Stack,如果Tag中存在 if (FindInStack(tagName) /在栈中找到名为tagName的元素,则把找到的元素出栈 PopTag(tagName); else /对于xxx之间的文本xxx,这里将作为TextTag来处理 m_CurrentText.Append(GetCurrentChar(); /继续处理下一个字符 ch = MoveNext(); /解析完成以后,如果栈不空,那么把元素出栈,并把最后一次出栈的元素作为根 if (Stack.Count 0) HtmlTag tag = null; while (Stack.Count 0) tag = Stac
4、k.Pop(); PopTag(tag); /最后一个元素作为根元素 if (tag != null) m_listRoot.Add(tag); private void PopTag(HtmlTag tag) int iLevel = Stack.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); Ht
5、mlTag tag = Stack.Pop(); /元素出栈 int iLevel = Stack.Count; /记录栈元素数 while (tag.Name != tagName) /将tag放入第iLevel层的List中 HashTableiLevel.Add(tag); tag = Stack.Pop(); iLevel = Stack.Count; /元素出栈后续处理 PopTag(tag); private HtmlTag GetTag() if (如果发现是 (ch iBeginPos = Index; /记录开始位置/表示可能是一个标签HtmlTag tag = GetTag
6、(); /解析此Tag if (tag != null)/首先判断是否有文本 if (m_CurrentText.Lenght 0)/将文本作为一个普通Tag入栈 Stack.Push(new HtmlTextTag(m_CurrentText);tag.BeginPos = iBeginPos; /记录此Tag的开始位置 Stack.Push(tag); /把Tag入栈 ch = GetCurrentChar();)/可能是结束标签 tagName = GetTagName();/从上到下查看Stack,如果Tag中存在 if (FindInStack(tagName)/在栈中找到名为tag
7、Name的元素,则把找到的元素出栈 PopTag(tagName);else/对于xxx之间的文本xxx,这里将作为TextTag来处理 m_CurrentText.Append(GetCurrentChar();/继续处理下一个字符 /解析完成以后,如果栈不空,那么把元素出栈,并把最后一次出栈的元素作为根 if (Stack.Count HtmlTag tag = null;while (Stack.Count tag = Stack.Pop();PopTag(tag);/最后一个元素作为根元素 m_listRoot.Add(tag);private void PopTag(HtmlTag
8、tag)int iLevel = Stack.Count;/找到了元素,把iLevel到m_IMaxLevel中所有的元素按照全部作为tag的子元素 for (int i = iLevel + 1; i for (j = 0; j tag.Children.Add(HashTableij);/表示栈已经为空,那么最后一次出栈的tag将作为根 if (Stack.Count = 0)private void PopTag(string tagName)/* 元素出栈的时候,首先需要把当前已经存在了的HtmlTextTag入栈* 比如:文本段1文本段2文本段3* 在Parse中,当解析出入栈前,需
9、要先把入栈* 在这里,解析出了结束标志* 那么首先需要把* 解析出则需要把* 这样才能够保证作为的子节点*/HtmlTag tag = Stack.Pop(); /元素出栈 /记录栈元素数 while (tag.Name != tagName)/将tag放入第iLevel层的List中 HashTableiLevel.Add(tag);iLevel = Stack.Count;/元素出栈后续处理 private HtmlTag GetTag()if (如果发现是 SkipComment();HtmlTag tag = new HtmlTag();tag.Name = GetTagName();
10、/这里的Attribute我将其作为HashTable类型,Hash属性名=属性值 tag.Attribute = GetTagAttribute();return tag; 解析结束以后,通过访问m_listRoot就可以遍历出所有的节点了。上面仅仅是给出了大概的方法,不过我相信要将上面的方法转换成可运行代码,各位都是有这个能力的。解析Html生成标签树(二) 12:08| 分类:解析 div html td 阿道夫 |字号大中小 订阅 前面两篇讲解了解析Html的思想个核心算法,感谢各位提出了意见。先专门列出一文作为解释:1、ViewStates提到,“”怎么办?这个是可以解析出来的,其中解析后节点名为“td”,而“ 阿道夫骄傲了沙发如图:上面的图中,包含了上面提到的例子。回复ml_dark 兄象这种. 你看看你的解析结果.解析结果如上图。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2