使用HtmlParser解析HTML

如果要对HTML进行解析,提取HTML的数据或者修改HTML数据,HtmlParser是一个不错的选择.
使用HtmlParser可以解析本地和网络上的HTML数据:
Parser parser = new Parser( new Winista.Text.HtmlParser.Http.HttpProtocol(new Uri("uriString")));

Parser parser 
= new Parser( new Winista.Text.HtmlParser.Lex.Lexer( "HtmlString" ) );

System.IO.Stream stream 
= new System.IO.FileStream( "filePath" , System.IO.FileMode.Open );
Parser parser 
= new Parser( new Winista.Text.HtmlParser.Lex.Lexer( new Winista.Text.HtmlParser.Lex.Page( stream ,"charSet") ) );
还可以分析某些特定节点的数据,使用 NodeClassFilter 指定要分析的节点类型:
NodeFilter filter = new NodeClassFilter( typeof( Winista.Text.HtmlParser.Tags.Div ) );
使用Parser实例的Parse方法可以获得节点数组
NodeList nodeList = parser.Parse( null );

NodeList nodeList 
= parser.Parse( filter);
现在分析一下的一段HTML:
<div class="divCss" id="div_1">
    
<div name="div" class="divCss" id="div_2">div_2</div>
    
<table name="table" id="table_1">
        
<tr>
            
<td>HtmlParser</td>
            
<td><div id="div_3"><font color="red">HtmlParser</font></div></td>
        
</tr>
    
</table>
</div>

txtResult是显示分析处理后的数据,txtSource是读取HTML数据的文本框
//记录个节点的起始位置,避免重复处理
    IList<int> start = new List<int>( );
    
protected void Button1_Click ( object sender , EventArgs e )
ExpandedBlockStart.gifContractedBlock.gif    
{
        
this.txtResult.Text = string.Empty;
        Lexer lexer 
= new Lexer( this.txtSource.Text );
        Parser parser 
= new Parser( lexer );
        NodeFilter filter 
= new NodeClassFilter( typeof( Winista.Text.HtmlParser.Tags.Div ) );
        NodeList nodeList 
= parser.Parse( null );
        
if ( nodeList.Count == 0 )
            txtResult.Text 
= "没有符合要求的节点";
        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
for ( int i = 0 ; i < nodeList.Count ; i++ )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                paserData( nodeList[i] );
            }

        }

    }

    
private ITag getTag ( INode node )
ExpandedBlockStart.gifContractedBlock.gif    
{
        
if ( node == null )
            
return null;
       return 
 node is ITag  ? node as ITag :  null;
    }


    
private void paserData ( INode node)
ExpandedBlockStart.gifContractedBlock.gif    
{
        ITag tag 
= getTag( node );
        
if ( tag != null && !tag.IsEndTag( ) && !start.Contains(tag.StartPosition))
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
object oId = tag.GetAttribute( "ID" );
            
object oName = tag.GetAttribute( "name" );
            
object oClass = tag.GetAttribute( "class" );
            
this.txtResult.Text += tag.TagName + ":\r\nID:" + oId + " Name:" + oName
                   
+ " Class:" + oClass + " StartPosition:" + tag.StartPosition.ToString( ) + "\r\n";
            start.Add( tag.StartPosition );
        }

        
//子节点
        if ( node.Children != null && node.Children.Count > 0 )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            paserData( node.FirstChild );
        }

        
//兄弟节点
        INode siblingNode = node.NextSibling;
        
while ( siblingNode != null )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            paserData( siblingNode );
            siblingNode 
= siblingNode.NextSibling;
        }

    }
txtResult显示的数据为:
DIV:
ID:div_1 Name: Class:divCss StartPosition:0
DIV:
ID:div_2 Name:div Class:divCss StartPosition:34
TABLE:
ID:table_1 Name:table Class: StartPosition:90
TR:
ID: Name: Class: StartPosition:127
TD:
ID: Name: Class: StartPosition:136
TD:
ID: Name: Class: StartPosition:160
DIV:
ID:div_3 Name: Class: StartPosition:164
FONT:
ID: Name: Class: StartPosition:180
HtmlParser将我们指定的数据给分析出来了,现在来对要分析的数据进行一些修改:给没有name和class属性的指定属性:
           object oId = tag.GetAttribute( "ID" );
            
object oName = tag.GetAttribute( "name" );
            
object oClass = tag.GetAttribute( "class" );

            
if ( oName == null )
ExpandedBlockStart.gifContractedBlock.gif            
{
                oName 
= "name";
                tag.SetAttribute( 
"name" , oName.ToString( ) );
            }

            
if ( oClass == null )
ExpandedBlockStart.gifContractedBlock.gif            
{
                oClass 
= "class";
                tag.SetAttribute( 
"name" , oClass.ToString( ) );
            }

            
this.txtResult.Text += tag.TagName + ":\r\nID:" + oId + " Name:" + oName
                   
+ " Class:" + oClass + " StartPosition:" + tag.StartPosition.ToString( ) + "\r\n";
            start.Add( tag.StartPosition );
txtResult显示的数据为:
DIV:
ID:div_1 Name:name Class:divCss StartPosition:0
DIV:
ID:div_2 Name:div Class:divCss StartPosition:34
TABLE:
ID:table_1 Name:table Class:class StartPosition:90
TR:
ID: Name:name Class:class StartPosition:127
TD:
ID: Name:name Class:class StartPosition:136
TD:
ID: Name:name Class:class StartPosition:160
DIV:
ID:div_3 Name:name Class:class StartPosition:164
FONT:
ID: Name:name Class:class StartPosition:180
HtmlParser实现了我们的目的,现在在给节点为DIV并且ID为div_3的节点添加一个子节点:
            object oId = tag.GetAttribute( "ID" );
            
object oName = tag.GetAttribute( "name" );
            
object oClass = tag.GetAttribute( "class" );
            
if ( tag.TagName == "DIV" && tag.GetAttribute( "ID" ) == "div_3" )
ExpandedBlockStart.gifContractedBlock.gif            
{
                INode newNode 
= new TextNode( "add a new node" );
                tag.Children.Add( newNode );
            }

            
this.txtResult.Text += tag.TagName + ":\r\nID:" + oId + " Name:" + oName
                   
+ " Class:" + oClass + " StartPosition:" + tag.StartPosition.ToString( ) + "\r\n";
输出nodeList[0].ToHtml( ):
<div class="divCss" id="div_1">
    
<div name="div" class="divCss" id="div_2">div_2</div>
    
<table name="table" id="table_1">
        
<tr>
            
<td>HtmlParser</td>
            
<td><div id="div_3"><font color="red">HtmlParser</font>add a new node</div></td>
        
</tr>
    
</table>
</div>
id为div_3的div节点后面加上了要添加的数据.

转载于:https://www.cnblogs.com/amityat/archive/2009/12/21/1628847.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinCE中得Catalog Items前的标记图标的意义总结

先看下来自微软对Platform Builder里的图标解释&#xff0c;在以后的CE里&#xff0c;也类似。 The Catalog window and the OSDesignView tab contain a number of icons used to represent object types. The icons make it possible for you to differentiate between Catal…

JavaScript 图片上传预览效果

图片上传预览是一种在图片上传之前对图片进行本地预览的技术。 使用户选择图片后能立即查看图片&#xff0c;而不需上传服务器&#xff0c;提高用户体验。 但随着浏览器安全性的提高&#xff0c;要实现图片上传预览也越来越困难。 不过群众的智慧是无限的&#xff0c;网上已经有…

【转】GigE Vision简介

转自&#xff1a;GigE Vision简介_计算机视觉小菜鸟的专栏-CSDN博客_gige vision GigE Vision是由AIA制定的通信协议&#xff0c;用来实现在机器视觉领域利用千兆以太网接口进行图像的高速传输。该标准是基于UDP协议&#xff0c;与普通网络数据包不同之处在于应用层协议&#…

在Sql Server 2005使用公用表表达式CTE简化复杂的查询语句

公用表表达式CTE是Sql Server 2005引入的一种新的表表达式。CTE在许多方面都类似于派生表。逻辑上CTE是一个临时结果集&#xff0c;它仅仅存在于它发生的语句中。您可以在SELECT、INSERT、DELETE、UPDATE或CTEATE VIEW语句中建立一个CTE。 CTE的优点 与派生表不同&#xff0c;C…

【转】搞机:window10安装Linux子系统(WSL)及迁移到非系统盘

转自&#xff1a;搞机&#xff1a;window10安装Linux子系统&#xff08;WSL&#xff09;及迁移到非系统盘_泛泛之素-CSDN博客_wsl移动到非系统盘 痛点&#xff1a; 在电脑上想要使用linux又想使用windows系统只能安装双系统&#xff0c;因为虚拟机的性能差且使用麻烦&#xf…

插座上的Linux充电器.不..Marvell Plug Computer

一直以来&#xff0c;台式机都有变小的趋势&#xff0c;于是变成了一体机&#xff0c;主机也有变小的趋势&#xff0c;那样可以占用更小的空间&#xff0c;却提供一样的功 能&#xff0c;Marvell Plug Computer 3.0 同样是那种壁插式主机&#xff0c;身形小巧&#xff0c;能够直…

【转】tftp命令详解

转自&#xff1a;tftp命令详解 - 张大猛 - 博客园 介绍一个 FTP客户端-IIS7服务器管理工具 作为FTP客户端&#xff0c;它支持批量管理ftp站点。定时上传和定时下载&#xff0c;定时备份&#xff0c;且操作简洁。同时iis7服务器管理工具还是vnc客户端。并且支持批量管理管理…

【转】聊聊Linux操作系统中的显示管理器及如何更换

转自&#xff1a;聊聊Linux操作系统中的显示管理器及如何更换 - linux-123 - 博客园 聊聊Linux操作系统中的显示管理器及如何更换 | 《Linux就该这么学》 什么是 Linux 中的显示管理器&#xff1f; 简单来说&#xff0c;显示管理器display manager&#xff08;DM&#xff09…

【转】[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx

转自&#xff1a;[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx_Ryan ZHENG的专栏-CSDN博客 WSL2本质上是一个虚拟机&#xff0c;因此必然存在磁盘镜像文件。 默认情况下&#xff0c;这个镜像文件会放在C盘&#xff08;参考官网举例&#xff1a;%LOCALAPPDATA%\Packages<PackageFa…

【转】Ubuntu中SVN客户端安装+使用

转自&#xff1a;Ubuntu中SVN客户端安装使用_三少GG-CSDN博客 1、 安装 svn客户端&#xff1a; apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了 svn的安装。当然&#xff0c;也可以源码安装 svn&#xff0c;下载 subversion 一个最新版本的源…

【转】CT图像重构方法详解——傅里叶逆变换法、直接反投影法、滤波反投影法

转自&#xff1a;​​​​​​CT图像重构方法详解——傅里叶逆变换法、直接反投影法、滤波反投影法_Absolute Zero-CSDN博客_反投影法 绪 在做CT图像处理的时候遇到很多问题&#xff0c;对于滤波反变换有许多细节存在疑问&#xff0c;经过多天查找资料和利用MATLAB程序一步步实…

【转】交织容积重建技术:基本原理与临床价值

转自&#xff1a;交织容积重建技术&#xff1a;基本原理与临床价值_湃客_澎湃新闻-The Paper 原创 赵喜同学 XI区 单击上方蓝色字体 XI 区 或长按识别下方二维码关注我 大家好&#xff0c;欢迎大家访问XI区&#xff01; 所有医学成像系统的目标是从测量数据中提取最大数量的诊…

Tahoma,Arial和宋体英文字体

几年前一直用简体中文版的Widnows XP&#xff0c;从来没有觉得字体怎么怎么样。偶然看见英文版Windows XP就发现菜单或者文件夹的字体很好看&#xff0c;没怎么研究就把我的中文版XP换成了英文版并沿用至今。后来很久才知道可以在Control Panel -> Display -> Appearance…

【转】CT解析重建**

转自&#xff1a;CT解析重建 - 知乎 1、傅里叶变换&#xff08;Fourier Transform&#xff09; 白光可以分解成彩色光&#xff0c;彩色光也可合成白光&#xff1b;同样的通过傅里叶变换可将时域下的信号转变成傅里叶域的信号&#xff0c;通过傅里叶逆变换可转换回来。此外&am…

WINCE REG文件相关资料

REG文件 注册表文件&#xff0c;这个和Windows操作系统中使用的注册表文件基本一样&#xff0c;在BSP中主要是Platform.reg&#xff0c;该注册表文件描述了和硬件平台相关的配置&#xff0c;大部分是用来描述驱动的相关信息。 注册标的格式如下&#xff1a; de>[KEY1]de&g…

【转】由投影重建图像:滤波反投影、FDK、TFDK三维重建算法理论基础

转自&#xff1a;由投影重建图像&#xff1a;滤波反投影、FDK、TFDK三维重建算法理论基础_m0_37357063的博客-CSDN博客_fdk算法 1. 基础理论从&#xff1a; [1] RafaelC.Gonzalez, RichardE.Woods, Gonzalez,等. 阮秋琦等译.数字图像处理(第三版)[M]. 电子工业出版社, 2011.P2…

How to Use Hive-based Registry IN WINCE.NET

摘要&#xff1a;WINCE本身是一个完全在内存中运行的系统。每次启动都需要把NK.BIN拷贝到内存中相对应的地址。这样的系统就不需要了系统维护&#xff0c;但是如何“永久”的保存设置就成了问题。本文将介绍如何在Wince中实现设置的永久保存。 关键字&#xff1a;WINCE、嵌入式…

【转】libpcap实现机制及接口函数

转自&#xff1a;libpcap实现机制及接口函数 - 简书 1.Libpcap 的工作原理 Libpcap的工作原理可以描述为&#xff0c;当一个数据包到达网卡时&#xff0c;通过网络分接口&#xff08;即旁路机制&#xff09;将数据包发给BPF过滤器&#xff0c;匹配通过的数据包可以被libpcap利…

惊!MySQL官网巨变,下载被取消

随着欧盟的批准&#xff0c;甲骨文宣布收购Sun交易完成&#xff0c;与此同时甲骨文一系列动作也迅速展开。 甲骨文因MySQL被欧盟卡了大半年&#xff0c;在中国&#xff0c;MySQL的用户非常多&#xff0c;MySQL的前途无疑让人牵肠挂肚。并购之前&#xff0c;甲骨文说了很多&…

【转】【C++学习笔记】C++异常处理

转自&#xff1a;【C学习笔记】C异常处理&#xff01;你绝对不能错过的干货&#xff01; - 知乎 合理地使用C异常处理&#xff0c;能够使我们写出来的程序更加稳定强健&#xff0c;不易崩溃。那么&#xff0c;应该如何使用C异常处理呢&#xff1f;下面&#xff0c;我们就来向大…