zoukankan      html  css  js  c++  java
  • 为XPath自定义函数(因为XPath1.0的函数非常有限)[附源代码下载] 无为而为

    想要一个正则表达式的匹配函数,但是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"22new
            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"33new
            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"33new
            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

  • 相关阅读:
    C# 将DLL制作CAB包并在浏览器下载,自动安装。(Activex)(包括ie打开cab包一直弹出用户账户控制,确定之后无反应的解决办法。)
    C#解决WebClient不能下载https网页内容
    SQL Server 将两行或者多行拼接成一行数据
    IIS反向代理
    C# HTTP请求对外接口、第三方接口公用类
    SQL SERVER常用语法记录
    SQL SERVER 实现相同记录为空显示(多列去除重复值,相同的只显示一条数据)
    百度编辑器插入视频 实现可实时预览以及支持手机查看
    百度编辑器 动态修改上传图片路径以及上传视频路径
    .Net Core Api发布时报502.5 [The Application process failed to Start]问题的解决原因
  • 原文地址:https://www.cnblogs.com/cleo/p/365822.html
Copyright © 2011-2022 走看看