运算符+内置函数

使用XPath选择元素时,使用运算符+内置函数来进行筛选:

.//div[contains(@class,"ec_desc") or contains(@class,"ec_adv_title_desc")]
.//span[@class="ec_site" or @class="ec_adv_site"]

使用c# .net中添加XPath自定义函数

参考:

(http://technet.microsoft.com/zh-cn/magazine/dd567715(VS.100).aspx)

(http://www.cnblogs.com/shenba/archive/2009/12/18/1626898.html)

(http://msdn.microsoft.com/zh-cn/library/ms950806.aspx)

XsltContext,IXsltContextFunction,IXsltContextVariable

        public override IXsltContextFunction ResolveFunction(string prefix,
string name, XPathResultType[] ArgTypes)
{
XPathExtensionFunction func = null;
// Create an instance of appropriate extension function class.
switch (name)
{
// 匹配正则表达式, XPath1.0没有该方法
case "IsMatch":
func = new XPathExtensionFunction("IsMatch", 2, 2, new
XPathResultType[] { XPathResultType.String, XPathResultType.String }, XPathResultType.Boolean);
break;
case "Replace":
func = new XPathExtensionFunction("Replace", 3, 3, new
XPathResultType[] { XPathResultType.String, XPathResultType.String, XPathResultType.String }, XPathResultType.String);
break;
// 去除空格
case "Trim":
func = new XPathExtensionFunction("Trim", 1, 1,
new XPathResultType[] { XPathResultType.String }, XPathResultType.String);
break;
default:
throw new ArgumentException("没有定义" + name + "函数");
} return func;
}
        // 在运行时调用
public object Invoke(XsltContext xsltContext, object[] args, XPathNavigator docContext)
{
// The two custom XPath extension functions
switch (m_FunctionName)
{
case "IsMatch":
// 调用正则匹配 参数一为正则表达式
return Regex.IsMatch(args[0].ToString(), args[1].ToString());
case "Replace":
// 调用正则匹配 参数一为正则表达式
return Regex.Replace(args[0].ToString(), args[1].ToString(),args[2].ToString());
case "Trim":
return docContext.Value.Trim();
default:
throw new ArgumentException("没有定义" + m_FunctionName + "函数");
}
}
            XmlDocument doc = new XmlDocument();
doc.LoadXml(xml); XpathContext xpathContext = new XpathContext(); var nodes = doc.SelectNodes(@"//a[Replace(string(@href),'^.*2009-10.*$','xxx')='xxx']", xpathContext);
foreach (XmlNode item in nodes)
{
Console.WriteLine(item.Attributes["href"].Value);
}

注意:自定义函数时,引用属性作为参数时,使用string()函数转换一下

string(@href)

XPath其本质就是用来选择*ML元素的,对于自定义函数,应该是用来给选择元素的过程中,提供一个条件,不选,YESNO,所以本质上函数应该都是布尔型的返回值。即使你定义一个函数返回值不是布尔型,比如string,那么你就必须在XPath表达式中进行比较运算,类似 //span[myfun(str)='result']。否则没有任何意义。

XPath高级用法(冰山一角)的更多相关文章

  1. Xpath 高级用法

    xpath 高级用法 1. 匹配当前节点下的所有: .// . 表示当前 // 表示当前标签下的所有标签 注: 要配合使用 2. 匹配某标签的属性值: /@属性名称 这里以input里的value值为 ...

  2. 【爬虫】Xpath高级用法

    xpath速度比较快,是爬虫在网页定位中的较优选择,但是很多网页前端代码混乱难以定位,而学习定位也较为不易(主要是全面的教程较少),这里列出一点编程过程中可能有用的东西,欢迎共同学习批评指正.试验环境 ...

  3. Python装饰器的高级用法(翻译)

    原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...

  4. Selenium WebDriver高级用法

    Selenium GitHub地址 选择合适的WebDrvier WebDriver是一个接口,它有几种实现,分别是HtmlUnitDrvier.FirefoxDriver.InternetExplo ...

  5. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...

  6. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

  7. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  8. Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)

    上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...

  9. 再谈Newtonsoft.Json高级用法

    上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充. 阅读目录 动态改变属性序列化名称 枚举值序列 ...

随机推荐

  1. jquery 动态添加的代码不能触发绑定事件

    今天发现jQuery对动态添加的元素不触发事件,比如blur.click事件等 参考文章证明了我的结论,并给出了原因及解决方案 原因:程序找不到动态添加的节点. 解决方案:在绑定父元素后的子元素 $( ...

  2. xcode10设置自定义代码快 - Xcode10新功能新内容

    1. 2. 详情: Xcode10新功能新内容https://blog.csdn.net/u010960265/article/details/80630118

  3. [leetcode]392. Is Subsequence 验证子序列

    Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...

  4. LocalBroadcastManager 的使用

    一.使用本地广播发送一条广播(本例为自己发送自己接收,本地广播也可以是其他应用接收)然后接收到广播时回调Receiver类中的回调方法onReceive()在此方法中自定义发出通知 代码 packag ...

  5. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  6. part1:1-embeded学习心态

    遇到问题,要冷静分析问题,采用排除法,个个排除查找问题之所在!切记!在没分析完自己问题之前,别把问题所在指向他人!

  7. how to enable the Accessibility in the app

    第一部分 先要装一个accchecker,全称是 UI Accessibility Checker .下载地址: http://acccheck.codeplex.com/ 装了之后 用这个工具可以 ...

  8. 2018.09.16 loj#10243. 移棋子游戏(博弈论)

    传送门 题目中已经给好了sg图,直接在上面跑出sg函数即可. 最后看给定点的sg值异或和是否等于0就判好了. 代码: #include<bits/stdc++.h> #define N 2 ...

  9. Class^=,Class*= ,Class$=含义(转)

    在Twitter 中有看到如下selector: .show-grid [class*="span"] { background-color: #eee; text-align: ...

  10. UVa 12118 nspector's Dilemma (构造+DFS+欧拉回路)

    题意:给定n个点,e条边和每条边的长度t,每两个点之间都有路相连,让你求一条最短的路经过这e条边. 析:刚开始想到要判连通,然后把相应的几块加起来,但是,第二个样例就不过,后来一想,那么有欧拉回路的还 ...