嘿嘿,最近开始上班,不是过于太忙,而是自己一直在学习一些项目中用到的而我暂时还没接触的知识,WCF,log4等,感觉还没有总结的需要吧,虽然都了解啦,但是暂时还是初步的学习,基础的暂时是知道啦,还没有练习的太多吧,嘿嘿,由于以后就要常常使用XPath啦,所以就来做一个XPath的Demo练习下。
一.XPath的Demo
下面是在html页面上操作元素,使用XPath过滤想要的表格文本,然后以表格的形式保存在一个文本中,如下所示:
using System; using System.Web; using HtmlAgilityPack; using System.IO; using System.Xml; public class Handler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; int num = 0; string xpathtrNode = "//*[@id='ReportList']/thead/tr/th"; string xpathtdNode = "//*[@id='ReportList']/tbody/tr/td"; //获取html的路径 string path = context.Request.MapPath("HtmlPage.html"); //string html = File.ReadAllText(path); //使用Nuget包下载并添加引用HtmlAgilityPack,调用其方法获取html HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.Load(path); //创建html的节点 HtmlNode rootNode = htmlDoc.DocumentNode; //使用XPath获取需要查询的元素文本,返回一个HtmlNode类型的集合 HtmlNodeCollection tabList = rootNode.SelectNodes(xpathtrNode); HtmlNode tdNode = htmlDoc.DocumentNode; HtmlNodeCollection tdList = tdNode.SelectNodes(xpathtdNode); //HtmlNode td13=htmlDoc.DocumentNode; //HtmlNodeCollection td13List =td13.SelectNodes(xpLasttd); foreach ( HtmlNode item in tabList) { num++; string tableText = item.InnerText + " "; if (num == 13) { tableText = tableText + "\n"; num = 0; } //常见文件,把要输出的内容输出在Excel文件中 File.AppendAllText(@"F:\公司Xpath\tablepath.xls", tableText, System.Text.Encoding.Default); } foreach (HtmlNode td in tdList) { string tdText = td.InnerText; tdText = tdText + " "; num++; if (num == 13) { tdText = tdText + "\n"; num = 0; } File.AppendAllText(@"F:\公司Xpath\tablepath.xls", tdText, System.Text.Encoding.Default); } } }
二.XPath的运算符
运算符/特殊字符 | 说明 |
/ | 此路径运算符出现在模式开头时,表示应从根节点选择。 |
// | 从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降。 |
. | 当前上下文。 |
.. | 当前上下文节点父级。 |
* | 通配符;选择所有元素节点与元素名无关。(不包括文本,注释,指令等节点,如果也要包含这些节点请用node()函数) |
@ | 属性名的前缀。 |
@* | 选择所有属性,与名称无关。 |
: | 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。 |
( ) | 括号运算符(优先级最高),强制运算优先级。 |
[ ] | 应用筛选模式(即谓词,包括"过滤表达式"和"轴(向前/向后)")。 |
[ ] | 下标运算符;用于在集合中编制索引。 |
| | 两个节点集合的联合,如://messages/message/to | //messages/message/cc |
- | 减法。 |
div, | 浮点除法。 |
and, or | 逻辑运算。 |
mod | 求余。 |
not() | 逻辑非 |
= | 等于 |
!= | 不等于 |
特殊比较运算符 | < 或者 < <= 或者 <= > 或者 > >= 或者 >= 需要转义的时候必须使用转义的形式,如在XSLT中,而在XMLDOM的scripting中不需要转义。 |
轴名称 | 结果 |
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute | 选取当前节点的所有属性 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
namespace | 选取当前节点的所有命名空间节点 |
parent | 选取当前节点的父节点。 |
preceding | 直到所有这个节点的父辈节点,顺序选择每个父辈节点前的所有同级节点 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
self | 选取当前节点。 |
暂时的即先总结到这里啦,嘿嘿,对于XPath的一语法我只是初步的认识,但是熟练的掌握我还是要继续联系的,学习是要一直坚持的,友友们,加油加油!