文本段1文本段2文本段3*在Parse中,当解析出入栈前,需要先把"文本段1"入栈*在这里,解析出了结束标志*那么首先需要把"文本段2"入栈。
*解析出则需要把"文本段3'入栈。
*这样才能够保证"文本段1"和"文本段3"成为的子节点,而"文本段2"作为的子节点*/if(m_CurrentText.Lenght>0){//将文本作为一个普通Tag入栈Stack.Push(newHtmlTextTag(m_CurrentText));}HtmlTagtag=Stack.Pop();//元素出栈intiLevel=Stack.Count;//记录栈元素数while(tag.Name!
=tagName){//将tag放入第iLevel层的List中HashTable[iLevel].Add(tag);tag=Stack.Pop();iLevel=Stack.Count;}//元素出栈后续处理PopTag(tag);}privateHtmlTagGetTag(){if("如果发现是
--开头的元素")//则表示是注释{SkipComment();}HtmlTagtag=newHtmlTag();tag.Name=GetTagName();//这里的Attribute我将其作为HashTable类型,Hash[属性名]=属性值tag.Attribute=GetTagAttribute();returntag;}
publicvoidParse()
{
charch=GetCurrentChar();//取第一个字符
while(!
Eof())
{
if(ch=='
{
ch=MoveNext();//取下一个字符
if((ch>='A')&&(ch
{
iBeginPos=Index;//记录开始位置
//表示可能是一个标签
HtmlTagtag=GetTag();//解析此Tag
if(tag!
=null)
{
//首先判断是否有文本
if(m_CurrentText.Lenght>0)
{
//将文本作为一个普通Tag入栈
Stack.Push(newHtmlTextTag(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,这里将作为TextTag来处理
m_CurrentText.Append(GetCurrentChar());
}
//继续处理下一个字符
ch=MoveNext();
}
//解析完成以后,如果栈不空,那么把元素出栈,并把最后一次出栈的元素作为根
if(Stack.Count>0)
{
HtmlTagtag=null;
while(Stack.Count>0)
{
tag=Stack.Pop();
PopTag(tag);
}
//最后一个元素作为根元素
if(tag!
=null)
{
m_listRoot.Add(tag);
}
}
}
privatevoidPopTag(HtmlTagtag)
{
intiLevel=Stack.Count;
//找到了元素,把iLevel到m_IMaxLevel中所有的元素按照全部作为tag的子元素
for(inti=iLevel+1;i
{
for(j=0;j
{
tag.Children.Add(HashTable[i][j]);
}
}
//表示栈已经为空,那么最后一次出栈的tag将作为根
if(Stack.Count==0)
{
m_listRoot.Add(tag);
}
}
privatevoidPopTag(stringtagName)
{
/*
*元素出栈的时候,首先需要把当前已经存在了的HtmlTextTag入栈
*比如:
文本段1文本段2文本段3
*在Parse中,当解析出入栈前,需要先把"文本段1"入栈
*在这里,解析出了结束标志
*那么首先需要把"文本段2"入栈。
*解析出则需要把"文本段3'入栈。
*这样才能够保证"文本段1"和"文本段3"成为的子节点,而"文本段2"作为的子节点
*/
if(m_CurrentText.Lenght>0)
{
//将文本作为一个普通Tag入栈
Stack.Push(newHtmlTextTag(m_CurrentText));
}
HtmlTagtag=Stack.Pop();//元素出栈
intiLevel=Stack.Count;//记录栈元素数
while(tag.Name!
=tagName)
{
//将tag放入第iLevel层的List中
HashTable[iLevel].Add(tag);
tag=Stack.Pop();
iLevel=Stack.Count;
}
//元素出栈后续处理
PopTag(tag);
}
privateHtmlTagGetTag()
{
if("如果发现是
{
SkipComment();
}
HtmlTagtag=newHtmlTag();
tag.Name=GetTagName();
//这里的Attribute我将其作为HashTable类型,Hash[属性名]=属性值
tag.Attribute=GetTagAttribute();
returntag;
}解析结束以后,通过访问m_listRoot就可以遍历出所有的节点了。
上面仅仅是给出了大概的方法,不过我相信要将上面的方法转换成可运行代码,各位都是有这个能力的。
。
。
解析Html生成标签树
(二)
2011-04-0109:
12:
08|分类:
HTML|标签:
解析divhtmltd阿道夫|字号大中小订阅前面两篇讲解了解析Html的思想个核心算法,感谢各位提出了意见。
先专门列出一文作为解释:
1、ViewStates提到,“”怎么办?
这个是可以解析出来的,其中解析后节点名为“td”,而“阿道夫骄傲了沙发
如图:
上面的图中,包含了上面提到的例子。
回复ml_dark兄
象这种..你看看你的解析结果....
解析结果如上图。