为XPath自定义函数(因为XPath1.0的函数非常有限)[附源代码下载]
想要一个正则表达式的匹配函数,但是XPath1.0中间没有,
只好自己扩展一个,在网上搜了一下,有一篇文章不错,
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
该文章定义了一个split,一个replace,不过就是没有match,
只好在它的基础上,扩展一下
仔细观察一下代码,发现想要扩展一个函数很简单,只要修改这几段就好了:
1:CustomContext.cs
public override IXsltContextFunction ResolveFunction(string prefix,
string name, XPathResultType[] ArgTypes)
{
XPathRegExExtensionFunction func = null;
// Create an instance of appropriate extension function class.
switch (name)
{
case "Match":
// Usage
// myFunctions:Matches(string source, string Regex_pattern) returns Boolean
func = new XPathRegExExtensionFunction("Match", 2, 2, new
XPathResultType[] {XPathResultType.String, XPathResultType.String}
, XPathResultType.Boolean );
break;
case "Split":
// Usage
// myFunctions:Split(string source, string Regex_pattern, int n) returns string
func = new XPathRegExExtensionFunction("Split", 3, 3, new
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.Number}, XPathResultType.String);
break;
case "Replace":
// Usage
// myFunctions:Replace(string source, string Regex_pattern, string replacement_string) returns string
func = new XPathRegExExtensionFunction("Replace", 3, 3, new
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.String}, XPathResultType.String);
break;
}
return func;
}
2: XPathRegExExtensionFunction.cs
public object Invoke(XsltContext xsltContext, object[] args,
XPathNavigator docContext)
{
Regex r;
string str = null;
// The two custom XPath extension functions
switch (m_FunctionName)
{
case "Match":
r = new Regex(args[1].ToString());
MatchCollection m = r.Matches(args[0].ToString());
if (m.Count == 0)
{
return false;
}
else
{
return true;
}
break;
case "Split":
r = new Regex(args[1].ToString());
string[] s1 = r.Split(args[0].ToString());
int n = Convert.ToInt32(args[2]);
if (s1.Length < n)
str = "";
else
str = s1[n - 1];
break;
case "Replace":
r = new Regex(args[1].ToString());
string s2 = r.Replace(args[0].ToString(), args[2].ToString());
str = s2;
break;
}
return (object)str;
}
另外一个文件XPathExtensionVariable.cs其实和函数扩展没有太多的关系,那是设置参数的。
这连个文件修改好了之后,就可以调用了:
CustomContext cntxt = new CustomContext();
// Add a namespace definition for myFunctions prefix.
cntxt.AddNamespace("xdUtil", "http://myXPathExtensionFunctions");
query.SetContext(cntxt);
Evaluate(query, navigator);
当然,要是支持XPath2.0 就好了,XPath2.0这些函数都是内置支持的,可惜目前好像还不支持。
全部的代码在这里:
/Files/cleo/XPathExtFunction.rar
为XPath自定义函数(因为XPath1.0的函数非常有限)[附源代码下载]相关推荐
- 迅龙中文搜索 0.7 nSearch版 C# 源代码下载
迅龙中文搜索 0.7 nSearch版 C# 源代码下载 源代码 2007.2.27日发布 下载 http://gforge.osdn.net.cn/projects/xunlong/ 以发展 ...
- RT-Thread4.0正式发布了,还支持SMP (内附源代码下载地址)
源代码网盘下载地址:https://pan.baidu.com/s/1mgIAyWo#list/path=%2F (下拉至底部及可见RT-Thread4.0压缩包) RT-Thread 4.0版本代码 ...
- android one rom下载地址,速刷!一加6喜迎Android 9.0公测(附ROM下载链接)
8月15日消息 据相关媒体报道,继谷歌向旗下Pixel系列手机推送Android 9.0系统的正式版本(Android Pie)后,一加官方日前也宣布开启一加6手机的Android 9.0公测,并发布 ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转
目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...
- Xcode12.5的自定义代码块的使用和函数注释(学会事半功倍)
Xcode12.5的自定义代码块的使用和函数注释(学会事半功倍) 第一篇 快捷键的定义 @property (nonatomic , strong) <#type#> <#name# ...
- Hive函数(内置函数(字符串函数,数学函数,日期函数,集合函数,条件函数,聚合函数,表生成函数)和自定义函数(自定义函数创建流程,临时函数,永久函数)))(四)
Hive函数(内置函数和自定义函数) 一.内置函数 1.字符串函数 (1)ascii (2)base64 (3)concat (4)concat_ws (5)format_number (6)subs ...
- 8.Hive基础—函数—系统内置函数、常用内置函数、自定义函数、自定义UDF函数、自定义UDTF函数
本文目录如下: 第8章 函数 8.1 系统内置函数 8.2 常用内置函数 8.2.1 空字段赋值 8.2.2 CASE WHEN THEN ELSE END 8.2.3 行转列 8.2.4 列转行 8 ...
- MYSQL自定义函数 的创建 create、查看函数、修改/更新函数删除函数 以及具体实例
创建函数 1)使用语法创建 // msyql中的函数一定有返回值 // 创建函数的语法,注意:参数和返回值一定要写长度,避免使用到关键字 create function 函数名([形参列表]) ret ...
最新文章
- Error creating bean with name 'defaultHandlerMapping' defined in ServletContext resource
- HTML5 模板推荐
- 2020暑期实习后台开发字节跳动笔试
- 【Spring注解驱动开发】自学java和三大框架要多久
- Linux常用监控命令简介 – vmstat,ps,free,uptime 等
- php 根据权重随机数,PHP根据概率产生随机数
- mdkstc系列器件支持包下载_Qorvo PAC系列高集成度电机控制芯片及应用
- (新鲜出炉)二本,两年经验,阿里P6面经
- android fragment 嵌套,Fragment嵌套Fragment时遇到的那些坑
- IDEA创建Scala
- VS2010编译器经常遇到的小问题
- 优先队列的优先级设置法
- 今日头条技术架构分析
- 图像空间和灰度分辨率
- 真◉彻底解决 gcr、quay、DockerHub 镜像下载难题!
- mysql查询数据库结构_mysql查询数据库下的表结构
- Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录
- 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单
- 移动互联网繁荣本质是什么
- 尴尬世纪互联的平淡财报
热门文章
- MySQL 5.1完全卸载
- 帮设计师与工程师更好沟通的实用技巧
- 机器学习入门---------numpy
- C# 多线程 与 委托
- ASP.NET WebAPI String 传值问题
- 第1次作业:这是我的一个响亮的标题X!
- 基于案例贯通 Spark Streaming 流计算框架的运行源码
- oracle学习笔记三
- require(),include(),require_once()和include_once()的异同
- javascript 基础下