重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天小编给大家分享一下c#常见的问题有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
创新互联建站专业为企业提供马鞍山网站建设、马鞍山做网站、马鞍山网站设计、马鞍山网站制作等企业网站建设、网页设计与制作、马鞍山企业网站模板建站服务,十多年马鞍山做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)
Html Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。
当然在解析DOM前需要加载html原始文件或者html的字符串,HtmlDocument类封装了支持此功能的方法,下面是加载html的方法介绍。
HtmlDocument类定义了多个重载的Load方法来实现以不同方式加载html,其实主要分为两种,一种是从Stream中加载html,另外一种是从物理路径加载html,分别见下面:
方法:public void Load(TextReader reader)
说明:从指定的 TextReader对象中加载Html
示例:
HtmlDcument doc?=new?HtmlDocument();
StreamReader sr?=?File.OpenText("file path");
doc.Load(sr);
基于上面方法,衍生出了几个不同重载方法。
以指定的Stream对象为主的有:
(1)public void Load(Stream stream)? ///从指定的Stream对象中加载html;
(2)public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)? ///指定是否从顺序字节流中解析编码格式
(3)public void Load(Stream stream, Encoding encoding)? ///指定编码格式
(4)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
(5)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
以指定的物理路径为主的有:
(1)public void Load(string path)
(2)public void Load(string path, bool detectEncodingFromByteOrderMarks)? ///指定是否从顺序字节流中解析编码格式
(3)public void Load(string path, Encoding encoding)? ///指定编码格式
(4)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
(5)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
HtmlDocument类中还定义了直接从html字符串中加载Html,如下:
方法:public void LoadHtml(string html)
说明:从指定的html字符串中加载html
示例:
HtmlDocument doc?=new?HtmlDocument();
string?html?="
doc.LoadHtml(html);
HtmlDocument类还有其他写DOM方法的定义,这里不作详细介绍,留作以后专门介绍Html Agility Pack写DOM章节介绍吧,这里着重介绍Html Agility pack解析DOM的细节。
通过HtmlDocument把html加载进来后,接着是要做什么呢?当然是对html解析了,解析DOM就需要提到HtmlNode类 了。 HtmlDocument类由属性DocumentNode属性返回当前Html解析后的一个全局的HtmlNode对象;如果想获取某一个元素的 HtmlNode,可以通过HtmlDocument类的GetElementbyId(string Id)方法来获取,返回指定某一个html元素的HtmlNode对象。如何通过HtmlNode对象来访问DOM呢?介绍之前先对它的功能了解下。
HtmlNode类实现了IXPathNavigable接口,这说明了它可以通过xpath来查询DOM了,如果对System.Xml 命名空间下的 XmlDocument类了解的,特别是使用过了SelectNodes()和SelectSingleNode()方法的朋友对使用HtmlNode类 将会很熟悉。其实Html Agility Pack内部是把html解析成xml文档格式了的,所以支持xml中的一些常用查询方式。下面对HtmlNode的一些主要的常用成员作简要的说明。
1)Attributes属性
获取当前Html元素的属性的集合,返回的是一个HtmlAttributeCollection对象。如一个div元素,它可能会定义一些属性, 如:
HtmlNode node?=?doc.GetElementbyId("title");
string?titleValue?=?node.Attributes["title"].Value;
或者
foreach(HtmlAttribute attr?in?node.Attributes)
{
Console.WriteLine("{0}={1}",attr.Name,attr.Value);
}
在获取属性值时,如果某一个属性名称不存在的话,Attributes["name"]返回的是null值。
2)FirstChild,LastChild,ChildNodes,ParentNode属性
FirstChild属性:返回所有子节点的第一个节点,如下面代码:
string?html?="
FirstChild则返回的是“Hello World!
” 的节点。
LastChild属性:返回所有子节点的最后一个节点,以上面的html为例,则返回“
ChildNodes属性:返回当前节点所有直接一代的子节点的集合,不包括跨代子节点,以上面的html为例,则返回“Hello World!
” 和“
ParentNode属性:返回当前节点的直接父节点。
3)获取Html源码和文本
HtmlNode类设计了OuterHtml属性和InnerHtml属性用于获取当前节点的Html源码。两者不同之处 是,OuterHtml属性返回的是包含当前节点的Html代码在内的所有Html代码,而InnerHtml属性返回的是当前节点里面子节点的所有 Html代码。如下面:
如要获取节点的文本值,通过InnerText属性来获取,InnerText属性过滤掉了所有的Html标记代码,只返回文本值,如下面:
Console.WriteLine(node.InnerText);///?return "Hello World!";
HtmlNode类提供了足够丰富的方法供查询当前节点下的子节点(元素),当然也包括查询当前节点的父节点(元素)的方法,下面列出主要的方法和使用说明。
获取父节点的系列方法:
1)public IEnumerable
获取当前节点的父节点列表(不包含自身)。
2)public IEnumerable
以指定一个名称来获取父节点的列表(不包含自身)。
3)public IEnumerable
获取当前节点的父节点列表(包含自身)。
4)public IEnumerable
以指定一个名称来获取父节点的列表(包含自身)。
获取子节点的系列方法:
1)public IEnumerable
获取当前节点下的所有子节点的列表,包括子节点的子节点(不包含自身)。
2)public IEnumerable
获取当前节点下的所有子节点的列表,包括子节点的子节点(包含自身)。
3)public IEnumerable
获取当前节点下的直接子节点的列表(不包含自身)。
4)public IEnumerable
获取当前节点下的直接子节点的列表(包含自身)。
5)public IEnumerable
获取当前节点下的以指定名称的子节点列表。
6)public IEnumerable
获取当前节点下的以指定名称的子节点的列表(包含自身)。
7)public HtmlNode Element(string name)
获取第一个符合指定名称的直接子节点的节点元素。
8)public IEnumerable
获取符合指定名称的所有直接子节点的节点列表。
9)public HtmlNodeCollection SelectNodes(string xpath)
获取符合指定的xpath的子节点列表。
10)public HtmlNode SelectSingleNode(string xpath)
获取符合指定的xpath的单个字节点元素。
查询节点的方法主要是上面10个方法,该类还有其他写节点的系列方法,这里不详细介绍写操作的方法,留作以后详细介绍。
结合Xpath进行查询节点是功能比较强大,这像操作xml那样方便。
简单例子的代码
下面例子是把博客园的精华区博客列表查询出来。执行结果如下面:
代码
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.IO;
using?HtmlAgilityPack;
namespace?DemoCnBlogs
{
class?Program
{
staticvoid?Main(string[] args)
{
HtmlWeb web?=new?HtmlWeb();
HtmlDocument doc?=?web.Load("");
HtmlNode node?=?doc.GetElementbyId("post_list");
StreamWriter sw?=?File.CreateText("log.txt");
foreach(HtmlNode child?in?node.ChildNodes)
{
if?(child.Attributes["class"]?==null||?child.Attributes["class"].Value?!="post_item")
continue;
HtmlNode hn?=?HtmlNode.CreateNode(child.OuterHtml);
///如果用child.SelectSingleNode(""titlelnk"]").InnerText这样的方式查询,是永远以整个document为基准来查询,
///这点就不好,理应以当前child节点的html为基准才对。
Write(sw, String.Format("推荐:{0}", hn.SelectSingleNode("//*[@class=\"diggnum\"]").InnerText));
Write(sw, String.Format("标题:{0}", hn.SelectSingleNode("//*[@class=\"titlelnk\"]").InnerText));
Write(sw, String.Format("介绍:{0}", hn.SelectSingleNode("//*[@class=\"post_item_summary\"]").InnerText));
Write(sw, String.Format("信息:{0}", hn.SelectSingleNode("//*[@class=\"post_item_foot\"]").InnerText));
Write(sw,?"----------------------------------------");
}
sw.Close();
Console.ReadLine();
}
staticvoid?Write(StreamWriter writer,?string?str)
{
Console.WriteLine(str);
writer.WriteLine(str);
}
}
}
以上就是“c#常见的问题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注创新互联行业资讯频道。