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.