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>

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. :) :)


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')]

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.


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')]

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 ... 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"]



1

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.