|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你觉得数据库怎么样?函数想要一个正则表达式的婚配函数,可是XPath1.0两头没有,
只好本人扩大一个,在网上搜了一下,有一篇文章不错,
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
该文章界说了一个split,一个replace,不外就是没有match,
只幸亏它的基本上,扩大一下
细心察看一下代码,发明想要扩大一个函数很复杂,只需修正这几段就行了:
1:CustomContext.cs
//Functiontoresolvereferencestomycustomfunctions.
publicoverrideIXsltContextFunctionResolveFunction(stringprefix,
stringname,XPathResultType[]ArgTypes)
{
XPathRegExExtensionFunctionfunc=null;
//Createaninstanceofappropriateextensionfunctionclass.
switch(name)
{
case"Match":
//Usage
//myFunctions:Matches(stringsource,stringRegex_pattern)returnsBoolean
func=newXPathRegExExtensionFunction("Match",2,2,new
XPathResultType[]{XPathResultType.String,XPathResultType.String}
,XPathResultType.Boolean);
break;
case"Split":
//Usage
//myFunctions:Split(stringsource,stringRegex_pattern,intn)returnsstring
func=newXPathRegExExtensionFunction("Split",3,3,new
XPathResultType[]{XPathResultType.String,XPathResultType.String,
XPathResultType.Number},XPathResultType.String);
break;
case"Replace":
//Usage
//myFunctions:Replace(stringsource,stringRegex_pattern,stringreplacement_string)returnsstring
func=newXPathRegExExtensionFunction("Replace",3,3,new
XPathResultType[]{XPathResultType.String,XPathResultType.String,
XPathResultType.String},XPathResultType.String);
break;
}
returnfunc;
}
2:XPathRegExExtensionFunction.cs
//Thismethodisinvokedatruntimetoexecutetheuserdefinedfunction.
publicobjectInvoke(XsltContextxsltContext,object[]args,
XPathNavigatordocContext)
{
Regexr;
stringstr=null;
//ThetwocustomXPathextensionfunctions
switch(m_FunctionName)
{
case"Match":
r=newRegex(args[1].ToString());
MatchCollectionm=r.Matches(args[0].ToString());
if(m.Count==0)
{
returnfalse;
}
else
{
returntrue;
}
break;
case"Split":
r=newRegex(args[1].ToString());
string[]s1=r.Split(args[0].ToString());
intn=Convert.ToInt32(args[2]);
if(s1.Length<n)
str="";
else
str=s1[n-1];
break;
case"Replace":
r=newRegex(args[1].ToString());
strings2=r.Replace(args[0].ToString(),args[2].ToString());
str=s2;
break;
}
return(object)str;
}
别的一个文件XPathExtensionVariable.cs实在和函数扩大没有太多的干系,那是设置参数的。
这连个文件修正好了以后,就能够挪用了:
query=navigator.Compile("xdUtil:Match(9,d)");
CustomContextcntxt=newCustomContext();
//AddanamespacedefinitionformyFunctionsprefix.
cntxt.AddNamespace("xdUtil","http://myXPathExtensionFunctions");
query.SetContext(cntxt);
Evaluate(query,navigator);
固然,如果撑持XPath2.0就行了,XPath2.0这些函数都是内置撑持的,惋惜今朝仿佛还不撑持。
全体的代码在这里:
http://cleo.cnblogs.com/Files/cleo/XPathExtFunction.rar
出处:cleoBLOG
就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。 |
|