想要一个正则表达式的匹配函数,但是XPath1.0中间没有,
只好自己扩展一个,在网上搜了一下,有一篇文章不错,
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
该文章定义了一个split,一个replace,不过就是没有match,
只好在它的基础上,扩展一下

仔细观察一下代码,发现想要扩展一个函数很简单,只要修改这几段就好了:

1:CustomContext.cs

// Function to resolve references to my custom functions.
        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

// This method is invoked at run time to execute the user defined function.
        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其实和函数扩展没有太多的关系,那是设置参数的。

这连个文件修改好了之后,就可以调用了:

query = navigator.Compile("xdUtil:Match(9,'\\d')");
            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的函数非常有限)[附源代码下载]相关推荐

  1. 迅龙中文搜索 0.7 nSearch版 C# 源代码下载

    迅龙中文搜索 0.7  nSearch版   C# 源代码下载 源代码 2007.2.27日发布 下载  http://gforge.osdn.net.cn/projects/xunlong/ 以发展 ...

  2. RT-Thread4.0正式发布了,还支持SMP (内附源代码下载地址)

    源代码网盘下载地址:https://pan.baidu.com/s/1mgIAyWo#list/path=%2F (下拉至底部及可见RT-Thread4.0压缩包) RT-Thread 4.0版本代码 ...

  3. android one rom下载地址,速刷!一加6喜迎Android 9.0公测(附ROM下载链接)

    8月15日消息 据相关媒体报道,继谷歌向旗下Pixel系列手机推送Android 9.0系统的正式版本(Android Pie)后,一加官方日前也宣布开启一加6手机的Android 9.0公测,并发布 ...

  4. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  5. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  6. Xcode12.5的自定义代码块的使用和函数注释(学会事半功倍)

    Xcode12.5的自定义代码块的使用和函数注释(学会事半功倍) 第一篇 快捷键的定义 @property (nonatomic , strong) <#type#> <#name# ...

  7. Hive函数(内置函数(字符串函数,数学函数,日期函数,集合函数,条件函数,聚合函数,表生成函数)和自定义函数(自定义函数创建流程,临时函数,永久函数)))(四)

    Hive函数(内置函数和自定义函数) 一.内置函数 1.字符串函数 (1)ascii (2)base64 (3)concat (4)concat_ws (5)format_number (6)subs ...

  8. 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 ...

  9. MYSQL自定义函数 的创建 create、查看函数、修改/更新函数删除函数 以及具体实例

    创建函数 1)使用语法创建 // msyql中的函数一定有返回值 // 创建函数的语法,注意:参数和返回值一定要写长度,避免使用到关键字 create function 函数名([形参列表]) ret ...

最新文章

  1. Error creating bean with name 'defaultHandlerMapping' defined in ServletContext resource
  2. HTML5 模板推荐
  3. 2020暑期实习后台开发字节跳动笔试
  4. 【Spring注解驱动开发】自学java和三大框架要多久
  5. Linux常用监控命令简介 – vmstat,ps,free,uptime 等
  6. php 根据权重随机数,PHP根据概率产生随机数
  7. mdkstc系列器件支持包下载_Qorvo PAC系列高集成度电机控制芯片及应用
  8. (新鲜出炉)二本,两年经验,阿里P6面经
  9. android fragment 嵌套,Fragment嵌套Fragment时遇到的那些坑
  10. IDEA创建Scala
  11. VS2010编译器经常遇到的小问题
  12. 优先队列的优先级设置法
  13. 今日头条技术架构分析
  14. 图像空间和灰度分辨率
  15. 真◉彻底解决 gcr、quay、DockerHub 镜像下载难题!
  16. mysql查询数据库结构_mysql查询数据库下的表结构
  17. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录
  18. 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单
  19. 移动互联网繁荣本质是什么
  20. 尴尬世纪互联的平淡财报

热门文章

  1. MySQL 5.1完全卸载
  2. 帮设计师与工程师更好沟通的实用技巧
  3. 机器学习入门---------numpy
  4. C# 多线程 与 委托
  5. ASP.NET WebAPI String 传值问题
  6. 第1次作业:这是我的一个响亮的标题X!
  7. 基于案例贯通 Spark Streaming 流计算框架的运行源码
  8. oracle学习笔记三
  9. require(),include(),require_once()和include_once()的异同
  10. javascript 基础下