今天小编给大家分享一下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(stri免费云主机域名ng 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#常见的问题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。
本文小编为大家详细介绍“HTML5中ol标签怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“HTML5中ol标签怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 定义和用法 HTML 4.01 与 HTML 5 之间的…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。