HtmlAgilityPack中的HtmlNode类与XmlNode类差不多,提供的功能也大同小异。下面来看看该类提供功能。
一、静态属性
public static Dictionary//ElementsFlags;获取集合的定义为特定的元素节点的特定行为的标志。表包含小写标记名称作为键和作为值的 HtmlElementFlags 组合 DictionaryEntry 列表。public static readonly string HtmlNodeTypeNameComment; //获取一个注释节点的名称。实际上,它被定义为 '#commentpublic static readonly string HtmlNodeTypeNameDocument; //获取文档节点的名称。实际上,它被定义为 '#document'public static readonly string HtmlNodeTypeNameText; //获取一个文本节点的名称。实际上,它被定义为 '#text'
二、属性
Attributes 获取节点的属性集合
ChildNodes 获取子节点集合(包括文本节点)Closed 该节点是否已关闭(</xxx>)ClosingAttributes 在关闭标签的属性集合FirstChild 获取第一个子节点HasAttributes 判断该节点是否含有属性HasChildNodes 判断该节点是否含有子节点HasClosingAttributes 判断该节点的关闭标签是否含有属性(</xxx class="xxx">)Id 获取该节点的Id属性InnerHtml 获取该节点的Html代码InnerText 获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出LastChild 获取最后一个子节点Line 获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)LinePosition 获取该节点位于第几列Name Html元素名NextSibling 获取下一个兄弟节点NodeType 获取该节点的节点类型OriginalName 获取原始的未经更改的元素名OuterHtml 整个节点的代码OwnerDocument 节点所在的HtmlDocument文档ParentNode 获取该节点的父节点PreviousSibling 获取前一个兄弟节点StreamPosition 该节点位于整个Html文档的字符位置XPath 根据节点返回该节点的XPath代码示例:
static void Main(string[] args) { //
- //
- 年龄:21~30之间 //
- 婚史:未婚 //
- 地区:不限 //
- 身高:175~185厘米之间 //
- 学历:不限 //
- 职业:不限 //
- 月薪:不限 //
- 住房:不限 //
- 购车:不限 //
三、方法
IEnumerable<HtmlNode> Ancestors(); 返回此元素的所有上级节点的集合。
IEnumerable<HtmlNode> Ancestors(string name); 返回此元素参数名字匹配的所有上级节点的集合。IEnumerable<HtmlNode> AncestorsAndSelf(); 返回此元素的所有上级节点和自身的集合。IEnumerable<HtmlNode> AncestorsAndSelf(string name); 返回此元素的名字匹配的所有上级节点和自身的集合。HtmlNode AppendChild(HtmlNode newChild); 将参数元素追加到为调用元素的子元素(追加在最后)void AppendChildren(HtmlNodeCollection newChildren); 将参数集合中的元素追加为调用元素的子元素(追加在最后)HtmlNode PrependChild(HtmlNode newChild); 将参数中的元素作为子元素,放在调用元素的最前面void PrependChildren(HtmlNodeCollection newChildren); 将参数集合中的所有元素作为子元素,放在调用元素前面static bool CanOverlapElement(string name); 确定是否可以保存重复的元素IEnumerable<HtmlAttribute> ChildAttributes(string name); 获取所有子元素的属性(参数名要与元素名匹配)HtmlNode Clone(); 本节点克隆到一个新的节点HtmlNode CloneNode(bool deep); 节点克隆到一个新的几点,参数确定是否连子元素一起克隆HtmlNode CloneNode(string newName); 克隆的同时更改元素名HtmlNode CloneNode(string newName, bool deep); 克隆的同时更改元素名。参数确定是否连子元素一起克隆void CopyFrom(HtmlNode node); 创建重复的节点和其下的子树。void CopyFrom(HtmlNode node, bool deep); 创建节点的副本。XPathNavigator CreateNavigator(); 返回的一个对于此文档的XPathNavigator static HtmlNode CreateNode(string html); 静态方法,允许用字符串创建一个新节点XPathNavigator CreateRootNavigator(); 创建一个根路径的XPathNavigator IEnumerable<HtmlNode> DescendantNodes(); 获取所有子代节点IEnumerable<HtmlNode> DescendantNodesAndSelf(); 获取所有的子代节点以及自身IEnumerable<HtmlNode> Descendants(); 获取枚举列表中的所有子代节点IEnumerable<HtmlNode> Descendants(string name); 获取枚举列表中的所有子代节点,注意元素名要与参数匹配IEnumerable<HtmlNode> DescendantsAndSelf(); 获取枚举列表中的所有子代节点以及自身IEnumerable<HtmlNode> DescendantsAndSelf(string name); 获取枚举列表中的所有子代节点以及自身,注意元素名要与参数匹配HtmlNode Element(string name); 根据参数名获取一个元素IEnumerable<HtmlNode> Elements(string name); 根据参数名获取匹配的元素集合bool GetAttributeValue(string name, bool def); 帮助方法,用来获取此节点的属性的值(布尔类型)。如果未找到该属性,则将返回默认值。int GetAttributeValue(string name, int def); 帮助方法,用来获取此节点的属性的值(整型)。如果未找到该属性,则将返回默认值。string GetAttributeValue(string name, string def); 帮助方法,用来获取此节点的属性的值(字符串类型)。如果未找到该属性,则将返回默认值。HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild); 将一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild); 讲一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系static bool IsCDataElement(string name); 确定是否一个元素节点是一个 CDATA 元素节点。static bool IsClosedElement(string name); 确定是否封闭的元素节点static bool IsEmptyElement(string name); 确定是否一个空的元素节点。static bool IsOverlappedClosingElement(string text); 确定是否文本对应于一个节点可以保留重叠的结束标记。void Remove(); 从父集合中移除调用节点void RemoveAll(); 移除调用节点的所有子节点以及属性void RemoveAllChildren(); 移除调用节点的所有子节点HtmlNode RemoveChild(HtmlNode oldChild); 移除调用节点的指定名字的子节点HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);移除调用节点调用名字的子节点,第二个参数确定是否连孙子节点一起移除HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild); 将调用节点原有的一个子节点替换为一个新的节点,第二个参数是旧节点HtmlNodeCollection SelectNodes(string xpath); 根据XPath获取一个节点集合HtmlNode SelectSingleNode(string xpath); 根据XPath获取唯一的一个节点HtmlAttribute SetAttributeValue(string name, string value); 设置调用节点的属性string WriteContentTo(); 将该节点的所有子级都保存到一个字符串中。void WriteContentTo(TextWriter outText); 将该节点的所有子级都保存到指定的 TextWriter。string WriteTo(); 将当前节点保存到一个字符串中。void WriteTo(TextWriter outText); 将当前节点保存到指定的 TextWriter。void WriteTo(XmlWriter writer); 将当前节点保存到指定的则 XmlWriter。示例代码:
static void Main(string[] args) { //
- //
- 年龄:21~30之间 //
- 婚史:未婚 //
- 地区:不限 //
- 身高:175~185厘米之间 //
- 学历:不限 //
- 职业:不限 //
- 月薪:不限 //
- 住房:不限 //
- 购车:不限 //
- ..包括子节点
- ...
//
//bool b = newnode.GetAttributeValue("class", false); //获取一个布尔值的属性,没有找到则返回第二个参数的默认值 //Console.WriteLine(b); //int i = newnode.GetAttributeValue("class", 0); //获取一个整形的属性,没有找到则返回第二个参数的默认值 //Console.WriteLine(i); string str = newnode.GetAttributeValue("class", ""); //获取一个字符串属性 Console.WriteLine(str); //输出 col say HtmlNode node11 = HtmlNode.CreateNode(" 我是加粗节点"); HtmlNode node12 = newnode.SelectSingleNode("h3"); newnode.InsertAfter(node11, node12); //意思是在node12代表的h3节点后面插入node11节点 Console.WriteLine(newnode.InnerHtml); //h3>爱情独白 我是加粗节点 爱情独白
//愿得一心人,白首不相离。我一直相信我的另一半就在茫茫人海中,有一天一定会与我相遇。
//愿得一心人... 留意到b节点已经被插入到h3后面 newnode.InsertBefore(node11, node12); //再插入多一次,方法不同罢了,这次是在node12带包的h3前面插入 Console.WriteLine(newnode.InnerHtml); //我是加粗节点
爱情独白
我是加粗节点愿得一心人 Console.WriteLine("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); newnode.RemoveChild(node11); //移除了第一个我是加粗节点 此方法的重载,第二个参数决定是否移除孙子节点 Console.WriteLine(newnode.InnerHtml); //
爱情独白
我是加粗节点愿得一心人.... newnode.RemoveAllChildren(); //移除所有子节点 Console.WriteLine(newnode.OuterHtml); //
所有子节点都被移除了 newnode.RemoveAll(); //移除所有的属性和子节点,由于子节点已经被上个方法移除了,因此这次连属性也移除了 Console.WriteLine(newnode.OuterHtml); //输出 注意到属性也被移除了。 //都移除光了,再来一个,还是刚才那个 HtmlNode newnode1 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[3]"); Console.WriteLine("==================="); Console.WriteLine(newnode1.OuterHtml); //输出 注意 移除是从HtmlDocument中移除的,再次获取获取不到了 HtmlNode newnode2 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[2]/div[2]/p"); Console.WriteLine(newnode2.OuterHtml); //她还没有设置不能忍受清单 // 邀请她设置 //
newnode2.Remove(); //从文档树中移除newnode2节点 HtmlNode newnode3 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[2]/div[2]/p"); //再次获取该节点 //Console.WriteLine(newnode3.OuterHtml); //报未将对象引用到对象的实例异常,明显是找不到了, HtmlNode newnode4 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[1]/div/div[1]/p[2]/b[1]"); Console.WriteLine(newnode4.OuterHtml); // 相册: // 4张 // HtmlNode node17 = HtmlNode.CreateNode(" 再次创建一个节点
"); newnode4.PrependChild(node17); //跟AppengChild类似,只是插入位置不同PrependChildren接受一个节点集合,一次过插入多个节点而已 Console.WriteLine(newnode4.OuterHtml); //输出 // 相册: // 再次创建一个节点
// 4张 // HtmlNode node16 = newnode4.SelectSingleNode("child::a[1]"); HtmlNode node18 = HtmlNode.CreateNode(" 新建一行
"); newnode4.ReplaceChild(node18, node16); Console.WriteLine(newnode4.OuterHtml); //输出 // 相册: // 再次创建一个节点
// 新建一行
张 //留意到node16代表得节点已经被替换掉了 // HtmlNode node19 = newnode4.SelectSingleNode("child::p[1]"); node19.SetAttributeValue("class","class1"); Console.WriteLine(node19.OuterHtml); //输出新建一行
Console.WriteLine(HtmlNode.IsOverlappedClosingElement(" 我爱你")); //输出 False Console.WriteLine(HtmlNode.IsCDataElement(" 我爱你")); //输出 False Console.WriteLine(HtmlNode.IsClosedElement(" 我爱你")); //输出 False Console.WriteLine(HtmlNode.IsEmptyElement(" 我爱你")); //输出 False Console.WriteLine(newnode4.OuterHtml); HtmlNode node20 = HtmlNode.CreateNode("新的第二行
"); newnode4.AppendChild(node20); HtmlNodeCollection hnc = newnode4.SelectNodes("//p"); //根据XPath一次过获取多个Node Console.WriteLine(hnc.Count); //输出29 string str1 = node20.WriteContentTo(); Console.WriteLine(str1); //输出 新的第二行 将节点内容写入字符串 //public void WriteContentTo(TextWriter outText); //public string WriteTo(); //public void WriteTo(TextWriter outText); //public void WriteTo(XmlWriter writer); Console.ReadKey(); }