Ich möchte eine Funktion zum Abgleich regulärer Ausdrücke, aber in XPath 1.0 gibt es keine solche Funktion.
Ich hatte keine andere Wahl, als selbst einen zu erweitern, und nachdem ich im Internet gesucht hatte, fand ich einen guten Artikel.
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
Dieser Artikel definiert eine Aufteilung und eine Ersetzung, es gibt jedoch keine Übereinstimmung.
Ich musste es auf dieser Grundlage erweitern. Nachdem
ich den Code sorgfältig beobachtet hatte, stellte ich fest, dass es sehr einfach ist, eine Funktion zu erweitern. Ändern Sie einfach diese Absätze:
1: CustomContext.cs
// Funktion zum Auflösen von Verweisen auf meine benutzerdefinierten Funktionen.
öffentliche Überschreibung IXsltContextFunction ResolveFunction(String-Präfix,
Zeichenfolgenname, XPathResultType[] ArgTypes)
{
XPathRegExtensionFunction func = null;
// Erstellen Sie eine Instanz der entsprechenden Erweiterungsfunktionsklasse.
Schalter(Name)
{
Fall „Match“:
//Verwendung
// myFunctions:Matches(string source, string Regex_pattern) gibt Boolean zurück
func = new XPathRegExtensionFunction("Match", 2, 2, new
XPathResultType[] {XPathResultType.String, XPathResultType.String}
, XPathResultType.Boolean );
brechen;
Fall „Split“:
//Verwendung
// myFunctions:Split(string source, string Regex_pattern, int n) gibt string zurück
func = new XPathRegExtensionFunction("Split", 3, 3, new
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.Number}, XPathResultType.String);
brechen;
Fall „Ersetzen“:
//Verwendung
// myFunctions:Replace(string source, string Regex_pattern, string replacement_string) gibt string zurück
func = new XPathRegExtensionFunction("Replace", 3, 3, new
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.String}, XPathResultType.String);
brechen;
}
Rückgabefunktion;
}
2: XPathRegExtensionFunction.cs
// Diese Methode wird zur Laufzeit aufgerufen, um die benutzerdefinierte Funktion auszuführen.
öffentliches Objekt Invoke(XsltContext xsltContext, object[] args,
XPathNavigator docContext)
{
Regex r;
string str = null;
// Die beiden benutzerdefinierten XPath-Erweiterungsfunktionen
switch(m_FunctionName)
{
Fall „Match“:
r = new Regex(args[1].ToString());
MatchCollection m = r.Matches(args[0].ToString());
if (m.Count == 0)
{
return false;
}
anders
{
return true;
}
Pause;
Fall „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 = "";
anders
str = s1[n - 1];
brechen;
Fall „Ersetzen“:
r = new Regex(args[1].ToString());
string s2 = r.Replace(args[0].ToString(), args[2].ToString());
str = s2;
brechen;
}
return (object)str;
}
Eine andere Datei, XPathExtensionVariable.cs, hat eigentlich nichts mit der Funktionserweiterung zu tun. Sie wird zum Festlegen von Parametern verwendet.
Nachdem diese beiden Dateien geändert wurden, können Sie Folgendes aufrufen:
query = navigator.Compile("xdUtil:Match(9,'\d')");
CustomContext cntxt = new CustomContext();
// Eine Namespace-Definition für das myFunctions-Präfix hinzufügen.
cntxt.AddNamespace("xdUtil", " http://myXPathExtensionFunctions ");
query.SetContext(cntxt);
Auswerten(Abfrage, Navigator);
Natürlich wäre es großartig, wenn es XPath2.0 unterstützen würde. Diese Funktionen von XPath2.0 werden alle standardmäßig unterstützt, aber leider scheint es noch nicht unterstützt zu werden.
Der vollständige Code ist hier: