정규식 일치 함수를 원하지만 XPath 1.0에는 그러한 함수가 없습니다.
어쩔 수 없이 제가 직접 하나 확장해 보았는데, 인터넷으로 검색해 보니 좋은 글이 있었습니다.
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
이 문서에서는 분할 및 교체를 정의하지만 일치하는 항목이 없습니다.
코드를 주의 깊게 관찰한
후에는 함수를 확장하는 것이 매우 간단하다는 것을 알았습니다.
다음 단락을 수정하면 됩니다.1: CustomContext.cs
// 내 사용자 정의 함수에 대한 참조를 확인하는 함수입니다.
공개 재정의 IXsltContextFunction ResolveFunction(문자열 접두사,
문자열 이름, XPathResultType[] ArgTypes)
{
XPathRegExtensionFunction func = null;
// 적절한 확장 함수 클래스의 인스턴스를 생성합니다.
스위치(이름)
{
"일치":
//용법
// myFunctions:Matches(string source, string Regex_pattern)는 부울을 반환합니다.
func = new XPathRegExtensionFunction("일치", 2, 2, new
XPathResultType[] {XPathResultType.String, XPathResultType.String}
, XPathResultType.Boolean );
부서지다;
사례 "분할":
//용법
// myFunctions:Split(string source, string Regex_pattern, int n)은 문자열을 반환합니다.
func = new XPathRegExtensionFunction("분할", 3, 3, new
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.Number}, XPathResultType.String);
부서지다;
"교체":
//용법
// myFunctions:Replace(string source, string Regex_pattern, string replacement_string)은 문자열을 반환합니다.
func = new XPathRegExtensionFunction("교체", 3, 3, new
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.String}, XPathResultType.String);
부서지다;
}
반환 기능;
}
2: XPathRegExtensionFunction.cs
// 이 메소드는 사용자 정의 함수를 실행하기 위해 런타임에 호출됩니다.
공용 객체 Invoke(XsltContext xsltContext, object[] args,
XPathNavigator docContext)
{
정규식 r;
문자열 str = null;
// 두 개의 사용자 정의 XPath 확장 함수
스위치(m_FunctionName)
{
"일치":
r = new Regex(args[1].ToString());
MatchCollection m = r.Matches(args[0].ToString());
if (m.Count == 0)
{
거짓을 반환;
}
또 다른
{
사실을 반환;
}
중단;
사례 "분할":
r = new Regex(args[1].ToString());
string[] s1 = r.Split(args[0].ToString());
int n = Convert.ToInt32(args[2]);
if (s1.길이 < n)
str = "";
또 다른
str = s1[n - 1];
부서지다;
"교체":
r = new Regex(args[1].ToString());
문자열 s2 = r.Replace(args[0].ToString(), args[2].ToString());
str = s2;
부서지다;
}
(객체)str을 반환합니다;
}
또 다른 파일인 XPathExtensionVariable.cs는 실제로 기능 확장과 관련이 없습니다. 매개변수를 설정하는 데 사용됩니다.
이 두 파일을 수정한 후 다음을 호출할 수 있습니다.
query = navigator.Compile("xdUtil:Match(9,'\d')");
CustomContext cntxt = 새로운 CustomContext();
// myFunctions 접두사에 대한 네임스페이스 정의를 추가합니다.
cntxt.AddNamespace("xdUtil", " http://myXPathExtensionFunctions ");
query.SetContext(cntxt);
평가(쿼리, 네비게이터);
물론 XPath2.0을 지원하면 좋겠지만 XPath2.0의 이러한 기능은 모두 기본적으로 지원되지만 아쉽게도 아직은 지원하지 않는 것 같습니다.
전체 코드는 다음과 같습니다.