Regex XPath

AyKay

Mitglied
"Finde heraus, was Du nicht gut kannst. Und das lasse dann sein!", Gordon Shumway

In meinem Fall: Reguläre Ausdrücke. Ich werde es nicht mehr lernen.

XPath-Ausdrücke brauchen immer noch zwingend eine Namensraum- (Namespace) Vergabe. JDom, etc. beispielsweise können kein XHTML mit folgendem XPath Ausdruck verarbeiten:

Code:
.//*[@id='content']/div[5]/table/tr[8]/td[2]/text()

Das geht nur mit:

Code:
.//*[@id='content']/x:div[5]/x:table/x:tr[8]/x:td[2]/text()

und

Java:
xpath.addNamespace("x", document.getRootElement().getNamespaceURI());

Soweit ein alter Hut. Wie zum %&&#%$ kann ich per RegEx die "x:" Prefixe einfügen. Ich habe 1.000 Versuche unternommen und 100x die Suchmaschine meines Vertrauens konsultiert. Verzweiflung naht.
 

faetzminator

Gesperrter Benutzer
Nach welchen Regeln soll das [c]x:[/c] eingefügt werden? Nach einem Slash vor Alpha scheint schon mal nicht hinzuhauen, genau so wenig wie wenn man sich auf das [xy] verlässt. Du gibst uns die Rules, wir schreiben dir den Regex :)
 

AyKay

Mitglied
Nach welchen Regeln soll das [c]x:[/c] eingefügt werden? Nach einem Slash vor Alpha scheint schon mal nicht hinzuhauen, genau so wenig wie wenn man sich auf das [xy] verlässt. [...]

Genau. Klappt alles nicht.

Mein (wohl falscher) Ansatz war:

Ersetze alle "/",
  • auf denen kein weiteres "/" folgt und
  • auf denen kein "@" folgt und
  • auf denen kein "text()" folgt
mit "/x:"

[...] Du gibst uns die Rules, wir schreiben dir den Regex

Ich will dich/euch nicht vergraueln, aber ich küsse euch die Är....e, wenn ihr das hinbekommt.
 

AyKay

Mitglied
Mein (wohl falscher) Ansatz war:

Ersetze alle "/",
  • auf denen kein weiteres "/" folgt und
  • auf denen kein "@" folgt und
  • auf denen kein "text()" folgt
mit "/x:"

Wobei das noch nicht ausreicht. Links von "/" darf außerdem kein "/" stehen, so daß die Regeln nach meinem Ansatz sein müßten:

Ersetze alle "/",
  • auf denen kein weiteres "/" folgt und
  • auf denen kein "@" folgt und
  • auf denen kein "text()" folgt und
  • die direkt links von sich kein "/" stehen haben
mit "/x:"

Wahrscheinlich total kompliziert gedacht. Der ganze Ansatz kann schon grundfalsch sein.

Mit Programmcode bekommt man es natürlich hin. Aber das kann es ja nicht sein.
Java:
package ....test;

import org.junit.Test;

public class StringTest2
{

	@Test
	public void test()
	{
		String testExpression1 = ".//*[@id='content']/div[5]/table/tr[8]/td[2]/text()";
		String testExpression2 = ".//*[@id='content']/div[5]/table/tr[8]/td[2]/div/a/@href";

		System.out.println("testExpression1: \t" + testExpression1);
		String enhancedExpression1 = enhanceXPathByNS(testExpression1, "x");
		System.out.println("enhanced: \t\t" + enhancedExpression1);
		System.out.println("testExpression2: \t" + testExpression2);
		String enhancedExpression2 = enhanceXPathByNS(testExpression2, "x");
		System.out.println("enhanced: \t\t" + enhancedExpression2);
	}

	protected String enhanceXPathByNS(String xpathString, String namespacePrefix)
	{
		String[] rightLimiters = new String[] { "/", "@", "text()" };
		String[] leftLimiters = new String[] { "/" };

		int slashIndex = -1;
		while ((slashIndex = xpathString.indexOf('/', ++slashIndex)) != -1)
		{
			// Check if term left of "/" is any left limiter
			boolean isHeadMatching = false;
			for (String leftLimiter : leftLimiters)
			{
				int leftStartPos = slashIndex - leftLimiter.length();
				int leftEndPos = slashIndex;
				if (leftStartPos > -1 && leftEndPos > -1)
					isHeadMatching |= xpathString.substring(leftStartPos, leftEndPos).equals(leftLimiter);
			}

			// Check if term right of "/" is any right limiter
			boolean isTailMatching = false;
			for (String rightLimiter : rightLimiters)
			{
				int rightStartPos = slashIndex + 1;
				int rightEndPos = slashIndex + 1 + rightLimiter.length();
				if (rightStartPos <= xpathString.length() && rightEndPos <= xpathString.length())
					isTailMatching |= xpathString.substring(rightStartPos, rightEndPos).equals(rightLimiter);
			}

			if (!isHeadMatching && !isTailMatching) // Take single "/" that have no adjacent terms
				xpathString = xpathString.substring(0, slashIndex + 1) + namespacePrefix + ":"
								+ xpathString.substring(slashIndex + 1);
		}

		return xpathString;
	}
}

Output:
Code:
testExpression1: 	.//*[@id='content']/div[5]/table/tr[8]/td[2]/text()
enhanced: 		.//*[@id='content']/x:div[5]/x:table/x:tr[8]/x:td[2]/text()
testExpression2: 	.//*[@id='content']/div[5]/table/tr[8]/td[2]/div/a/@href
enhanced: 		.//*[@id='content']/x:div[5]/x:table/x:tr[8]/x:td[2]/x:div/x:a/@href
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F RegEx bei Hexstring Allgemeine Java-Themen 8
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
Stillmatic RegEx Matches ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben