解析Html生成标签树Word下载.docx
- 文档编号:5202448
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:8
- 大小:16.57KB
解析Html生成标签树Word下载.docx
《解析Html生成标签树Word下载.docx》由会员分享,可在线阅读,更多相关《解析Html生成标签树Word下载.docx(8页珍藏版)》请在冰点文库上搜索。
如果在栈中找到与此结束标志名同名的元素(此元素属于栈中第iLevel层),那么表示找到匹配的Tag。
则Tag出栈,将HashTable[iLevel+1]到HashTable[maxLevel]中的所有元素取出作为此Tag的子节点。
放入第HashTable[iLevel]中。
并记录Tag的结束位置。
5.对于xxx之间的字符串xxx,将其作为特殊的HtmlTextTag处理。
出栈,和入栈操作与普通Tag类似。
6.当栈为空的时候表示最后一次出栈的Tag给根节点。
由于是在公司内部开发的东西,所以不可能把源代码拿出来粘贴,所以只能把大概的代码给出。
伪代码如下:
viewplaincopytoclipboardprint?
publicvoidParse(){charch=GetCurrentChar();
//取第一个字符while(!
Eof()){if(ch=='
='
A'
)&
&
(ch0){//将文本作为一个普通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<
m_iMaxLevel;
i++){for(j=0;
j<
HashTable[i].Count;
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'
*这样才能够保证"
和"
文本段3"
成为的子节点,而"
作为的子节点*/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>
(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();
)
//可能是结束标签
tagName=GetTagName();
//从上到下查看Stack,如果Tag中存在
if(FindInStack(tagName))
//在栈中找到名为tagName的元素,则把找到的元素出栈
PopTag(tagName);
else
//对于xxx之间的文本xxx,这里将作为TextTag来处理
m_CurrentText.Append(GetCurrentChar());
//继续处理下一个字符
//解析完成以后,如果栈不空,那么把元素出栈,并把最后一次出栈的元素作为根
if(Stack.Count>
HtmlTagtag=null;
while(Stack.Count>
tag=Stack.Pop();
PopTag(tag);
//最后一个元素作为根元素
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)
privatevoidPopTag(stringtagName)
/*
*元素出栈的时候,首先需要把当前已经存在了的HtmlTextTag入栈
*比如:
文本段1文本段2文本段3
*在Parse中,当解析出入栈前,需要先把"
入栈
*在这里,解析出了结束标志
*那么首先需要把"
*解析出则需要把"
*这样才能够保证"
作为的子节点
*/
HtmlTagtag=Stack.Pop();
//元素出栈
//记录栈元素数
while(tag.Name!
=tagName)
//将tag放入第iLevel层的List中
HashTable[iLevel].Add(tag);
iLevel=Stack.Count;
//元素出栈后续处理
privateHtmlTagGetTag()
if("
如果发现是
SkipComment();
HtmlTagtag=newHtmlTag();
tag.Name=GetTagName();
//这里的Attribute我将其作为HashTable类型,Hash[属性名]=属性值
tag.Attribute=GetTagAttribute();
returntag;
}解析结束以后,通过访问m_listRoot就可以遍历出所有的节点了。
上面仅仅是给出了大概的方法,不过我相信要将上面的方法转换成可运行代码,各位都是有这个能力的。
。
解析Html生成标签树
(二)
12:
08|分类:
解析divhtmltd阿道夫|字号大中小订阅前面两篇讲解了解析Html的思想个核心算法,感谢各位提出了意见。
先专门列出一文作为解释:
1、ViewStates提到,“”怎么办?
这个是可以解析出来的,其中解析后节点名为“td”,而“阿道夫骄傲了沙发
如图:
上面的图中,包含了上面提到的例子。
回复ml_dark兄
象这种..你看看你的解析结果....
解析结果如上图。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 解析 Html 生成 标签