网页教学网
 当前位置: 网页教学网 >> 网络编程 >> ASP.NET编程技术 >> 阅读:为XPath自定义函数(因为XPath1.0的函数非常有限)
[ HTML ] [ FW ] [ DW ] [ FP ] [ JS ] [ XML ] [ CSS ] [ 图象 ] [ FLASH ] [ .NET ] [ ASP ] [ JSP ] [ PHP ] [ 数据 ] [ 系统 ] [ 安全 ] [ 素材 ] [ 建站 ] [ 主机 ] [ 入门 ] [ 技巧 ]

为XPath自定义函数(因为XPath1.0的函数非常有限)

http://www.webjx.com  更新日期:2006-04-05 07:25  出处:  作者:

想要一个正则表达式的匹配函数,但是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这些函数都是内置支持的,可惜目前好像还不支持。

全部的代码在这里:
http://cleo.cnblogs.com/Files/cleo/XPathExtFunction.rar

出处:cleo BLOG

关键词:
推荐给好友】【关闭】【收藏本文
最新五条评论
查看全部评论
评论总数 0
您的评论
用户名: 新注册) 密 码: 匿名:
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为