Was ist der richtige XPath für die Auswahl von Attributen, die "foo" enthalten?

176

In Anbetracht dieser XML gibt XPath alle Elemente zurück, deren propAttribut enthält Foo(die ersten drei Knoten):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
ripper234
quelle
1
Warum schauen sich alle das Attribut "prop" an? Habe ich etwas verpasst? Es heißt nur, die ersten drei Knoten zu bekommen.
6
Jeder schaut sich das Prop-Attribut an, weil das gefragt wurde. Holen Sie sich alle Knoten, auf denen prop "Foo" enthält. Fügen Sie <a prop="Foo5" /> hinzu und Sie werden sehen, warum es nicht nur "die ersten drei Knoten" sind.
erlando
Die Frage im Körper ist ungeachtet des Titels schlecht formuliert. Kann foo wirklich in einem Requisitenattribut enthalten sein oder möchten Sie ernsthaft nur die ersten drei Knoten?
3
Ja, beziehen Sie sich bitte auf den Titel (und bearbeiten Sie ihn gerne).
Ripper234
Wenn Sie einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung benötigen, finden
Berücksichtigung der

Antworten:

307
//a[contains(@prop,'Foo')]

Funktioniert, wenn ich dieses XML verwende, um Ergebnisse zurückzugewinnen.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Bearbeiten: Eine andere Sache zu beachten ist, dass, während der XPath oben die richtige Antwort für diese bestimmte XML zurückgibt, wenn Sie garantieren möchten, dass Sie nur die "a" -Elemente im Element "bla" erhalten, sollten Sie, wie andere erwähnt haben, auch verwenden

/bla/a[contains(@prop,'Foo')]

Dadurch werden alle "a" -Elemente in Ihrem gesamten XML-Dokument durchsucht, unabhängig davon, ob Sie in einem "blah" -Element verschachtelt sind

//a[contains(@prop,'Foo')]  

Ich habe dies aus Gründen der Gründlichkeit und im Geiste des Stackoverflow hinzugefügt. :) :)

Evilhomer
quelle
3
xmlme.comLeitet jetzt zu einem anderen Host weiter und scheint das Tool oder ähnliches nicht zu hosten.
jpmc26
26

Dieser XPath gibt Ihnen alle Knoten mit Attributen, die 'Foo' enthalten, unabhängig vom Knotennamen oder Attributnamen:

//attribute::*[contains(., 'Foo')]/..

Wenn Sie mehr am Inhalt des Attributs selbst und nicht unbedingt am übergeordneten Knoten interessiert sind, lassen Sie einfach das / ..

//attribute::*[contains(., 'Foo')]
Alex Beynenson
quelle
2
Für alle Knoten//@*[contains(., 'Foo')]
Aliopi
16
descendant-or-self::*[contains(@prop,'Foo')]

Oder:

/bla/a[contains(@prop,'Foo')]

Oder:

/bla/a[position() <= 3]

Präpariert:

descendant-or-self::

Die Achse - Durchsuchen Sie jeden Knoten darunter und den Knoten selbst. Es ist oft besser, dies zu sagen als //. Ich bin auf einige Implementierungen gestoßen, bei denen // irgendwo bedeutet (Nachkomme oder Selbst des Wurzelknotens). Die anderen verwenden die Standardachse.

* or /bla/a

Das Tag - ein Platzhalter-Match und / bla / a ist ein absoluter Pfad.

[contains(@prop,'Foo')] or [position() <= 3]

Die Bedingung innerhalb von []. @prop ist eine Abkürzung für attribute :: prop, da attribute eine weitere Suchachse ist. Alternativ können Sie die ersten 3 mit der Funktion position () auswählen.

1729
quelle
6

John C ist am nächsten, aber XPath unterscheidet zwischen Groß- und Kleinschreibung. Der richtige XPath wäre also:

/bla/a[contains(@prop, 'Foo')]
Metro Schlumpf
quelle
4

Haben Sie etwas versucht wie:

// a [enthält (@prop, "Foo")]

Ich habe die Includes-Funktion noch nie verwendet, vermute aber, dass sie wie angekündigt funktionieren sollte ...

toddk
quelle
@toddk ... Sie haben ein nicht vorhandenes Attribut als Ziel ausgewählt: @foo. Sie möchten @prop anvisieren ;-)
Metro Smurf
4

Wenn Sie auch den Inhalt des Links selbst abgleichen müssen, verwenden Sie text ():

//a[contains(@href,"/some_link")][text()="Click here"]

SomeDudeSomewhere
quelle
2

/ bla / a [enthält (@prop, "foo")]

David Hill
quelle
1

Für den obigen Code ... // * [enthält (@ prop, 'foo')]

Digiguru
quelle
Dies ist für jedes Element mit foo in, aber das Attribut muss "prop" sein
digiguru
1

Versuche dies:

// a [enthält (@ prop, 'foo')]

Das sollte für alle "a" -Tags im Dokument funktionieren

Dani Duran
quelle