今天小編給大家分享一下c#常見的問題有哪些的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供馬鞍山網(wǎng)站建設(shè)、馬鞍山做網(wǎng)站、馬鞍山網(wǎng)站設(shè)計、馬鞍山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、馬鞍山企業(yè)網(wǎng)站模板建站服務(wù),十多年馬鞍山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
Html Agility Pack 源碼中的類大概有28個左右,其實(shí)不算一個很復(fù)雜的類庫,但它的功能確不弱,為解析DOM已經(jīng)提供了足夠強(qiáng)大的功能支持,可以跟jQuery操作DOM媲美:)
Html Agility Pack最常用的基礎(chǔ)類其實(shí)不多,對解析DOM來說,就只有HtmlDocument和HtmlNode這兩個常用的類,還有一個 HtmlNodeCollection集合類。
當(dāng)然在解析DOM前需要加載html原始文件或者h(yuǎn)tml的字符串,HtmlDocument類封裝了支持此功能的方法,下面是加載html的方法介紹。
HtmlDocument類定義了多個重載的Load方法來實(shí)現(xiàn)以不同方式加載html,其實(shí)主要分為兩種,一種是從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)? ///指定是否從順序字節(jié)流中解析編碼格式
(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)? ///指定是否從順序字節(jié)流中解析編碼格式
(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?="<div id="demo"><span style="color:red;"><h2>Hello World!</h2></span></div>";
doc.LoadHtml(html);
HtmlDocument類還有其他寫DOM方法的定義,這里不作詳細(xì)介紹,留作以后專門介紹Html Agility Pack寫DOM章節(jié)介紹吧,這里著重介紹Html Agility pack解析DOM的細(xì)節(jié)。
通過HtmlDocument把html加載進(jìn)來后,接著是要做什么呢?當(dāng)然是對html解析了,解析DOM就需要提到HtmlNode類 了。 HtmlDocument類由屬性DocumentNode屬性返回當(dāng)前Html解析后的一個全局的HtmlNode對象;如果想獲取某一個元素的 HtmlNode,可以通過HtmlDocument類的GetElementbyId(string Id)方法來獲取,返回指定某一個html元素的HtmlNode對象。如何通過HtmlNode對象來訪問DOM呢?介紹之前先對它的功能了解下。
HtmlNode類實(shí)現(xiàn)了IXPathNavigable接口,這說明了它可以通過xpath來查詢DOM了,如果對System.Xml 命名空間下的 XmlDocument類了解的,特別是使用過了SelectNodes()和SelectSingleNode()方法的朋友對使用HtmlNode類 將會很熟悉。其實(shí)Html Agility Pack內(nèi)部是把html解析成xml文檔格式了的,所以支持xml中的一些常用查詢方式。下面對HtmlNode的一些主要的常用成員作簡要的說明。
1)Attributes屬性
獲取當(dāng)前Html元素的屬性的集合,返回的是一個HtmlAttributeCollection對象。如一個div元素,它可能會定義一些屬性, 如:<div id="title" name="title" class="class-name" title="title div">***</div>,那Attributes返回的HtmlAttributeCollection就包含了 “id,name,class,title”的信息。HtmlAttributeCollection類是實(shí)現(xiàn)了接口 IList<HtmlAttribute>的一個集合類,故此可以通過下面代碼方式訪問每一個成員。
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屬性:返回所有子節(jié)點(diǎn)的第一個節(jié)點(diǎn),如下面代碼:
string?html?="<div id="demo"><span style="color:red;"><h2>Hello World!</h2></span><div id="innerDiv">inner div</div></div>";
FirstChild則返回的是“<span style="color:red;"><h2>Hello World!</h2></span>” 的節(jié)點(diǎn)。
LastChild屬性:返回所有子節(jié)點(diǎn)的最后一個節(jié)點(diǎn),以上面的html為例,則返回“<div id="innerDiv">inner div</div>”節(jié)點(diǎn)。
ChildNodes屬性:返回當(dāng)前節(jié)點(diǎn)所有直接一代的子節(jié)點(diǎn)的集合,不包括跨代子節(jié)點(diǎn),以上面的html為例,則返回“<span style="color:red;"><h2>Hello World!</h2></span>” 和“<div id="innerDiv">inner div</div>”兩個節(jié)點(diǎn)。
ParentNode屬性:返回當(dāng)前節(jié)點(diǎn)的直接父節(jié)點(diǎn)。
3)獲取Html源碼和文本
HtmlNode類設(shè)計了OuterHtml屬性和InnerHtml屬性用于獲取當(dāng)前節(jié)點(diǎn)的Html源碼。兩者不同之處 是,OuterHtml屬性返回的是包含當(dāng)前節(jié)點(diǎn)的Html代碼在內(nèi)的所有Html代碼,而InnerHtml屬性返回的是當(dāng)前節(jié)點(diǎn)里面子節(jié)點(diǎn)的所有 Html代碼。如下面:
如要獲取節(jié)點(diǎn)的文本值,通過InnerText屬性來獲取,InnerText屬性過濾掉了所有的Html標(biāo)記代碼,只返回文本值,如下面:
Console.WriteLine(node.InnerText);///?return "Hello World!";
HtmlNode類提供了足夠豐富的方法供查詢當(dāng)前節(jié)點(diǎn)下的子節(jié)點(diǎn)(元素),當(dāng)然也包括查詢當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)(元素)的方法,下面列出主要的方法和使用說明。
獲取父節(jié)點(diǎn)的系列方法:
1)public IEnumerable<HtmlNode> Ancestors()
獲取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)列表(不包含自身)。
2)public IEnumerable<HtmlNode> Ancestors(string name)
以指定一個名稱來獲取父節(jié)點(diǎn)的列表(不包含自身)。
3)public IEnumerable<HtmlNode> AncestorsAndSelf()
獲取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)列表(包含自身)。
4)public IEnumerable<HtmlNode> AncestorsAndSelf(string name)
以指定一個名稱來獲取父節(jié)點(diǎn)的列表(包含自身)。
獲取子節(jié)點(diǎn)的系列方法:
1)public IEnumerable<HtmlNode> DescendantNodes()
獲取當(dāng)前節(jié)點(diǎn)下的所有子節(jié)點(diǎn)的列表,包括子節(jié)點(diǎn)的子節(jié)點(diǎn)(不包含自身)。
2)public IEnumerable<HtmlNode> DescendantNodesAndSelf()
獲取當(dāng)前節(jié)點(diǎn)下的所有子節(jié)點(diǎn)的列表,包括子節(jié)點(diǎn)的子節(jié)點(diǎn)(包含自身)。
3)public IEnumerable<HtmlNode> Descendants()
獲取當(dāng)前節(jié)點(diǎn)下的直接子節(jié)點(diǎn)的列表(不包含自身)。
4)public IEnumerable<HtmlNode> DescendantsAndSelf()
獲取當(dāng)前節(jié)點(diǎn)下的直接子節(jié)點(diǎn)的列表(包含自身)。
5)public IEnumerable<HtmlNode> Descendants(string name)
獲取當(dāng)前節(jié)點(diǎn)下的以指定名稱的子節(jié)點(diǎn)列表。
6)public IEnumerable<HtmlNode> DescendantsAndSelf(string name)
獲取當(dāng)前節(jié)點(diǎn)下的以指定名稱的子節(jié)點(diǎn)的列表(包含自身)。
7)public HtmlNode Element(string name)
獲取第一個符合指定名稱的直接子節(jié)點(diǎn)的節(jié)點(diǎn)元素。
8)public IEnumerable<HtmlNode> Elements(string name)
獲取符合指定名稱的所有直接子節(jié)點(diǎn)的節(jié)點(diǎn)列表。
9)public HtmlNodeCollection SelectNodes(string xpath)
獲取符合指定的xpath的子節(jié)點(diǎn)列表。
10)public HtmlNode SelectSingleNode(string xpath)
獲取符合指定的xpath的單個字節(jié)點(diǎn)元素。
查詢節(jié)點(diǎn)的方法主要是上面10個方法,該類還有其他寫節(jié)點(diǎn)的系列方法,這里不詳細(xì)介紹寫操作的方法,留作以后詳細(xì)介紹。
結(jié)合Xpath進(jìn)行查詢節(jié)點(diǎn)是功能比較強(qiáng)大,這像操作xml那樣方便。
簡單例子的代碼
下面例子是把博客園的精華區(qū)博客列表查詢出來。執(zhí)行結(jié)果如下面:
代碼
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這樣的方式查詢,是永遠(yuǎn)以整個document為基準(zhǔn)來查詢,
///這點(diǎn)就不好,理應(yīng)以當(dāng)前child節(jié)點(diǎn)的html為基準(zhǔn)才對。
Write(sw, String.Format("推薦:{0}", hn.SelectSingleNode("//*[@class=\"diggnum\"]").InnerText));
Write(sw, String.Format("標(biāo)題:{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#常見的問題有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:c#常見的問題有哪些
本文路徑:http://muchs.cn/article30/piodso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、品牌網(wǎng)站建設(shè)、虛擬主機(jī)、標(biāo)簽優(yōu)化、云服務(wù)器、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)