wake-up-neo.com

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

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

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
159
ripper234
//a[contains(@prop,'Foo')]

Funktioniert, wenn ich diese XML verwende, um Ergebnisse zurück zu bekommen.

<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 Stapelüberlaufs hinzugefügt. :)

278
evilhomer

Mit diesem XPath erhalten Sie alle Knoten, deren Attribute 'Foo' enthalten, unabhängig vom Knotennamen oder Attributnamen:

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

Wenn Sie sich mehr für den Inhalt des Attributs selbst und nicht unbedingt für den übergeordneten Knoten interessieren, legen Sie einfach den Befehl/.. ab.

//attribute::*[contains(., 'Foo')]
22
Alex Beynenson
descendant-or-self::*[contains(@prop,'Foo')]

Oder:

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

Oder:

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

Präpariert:

descendant-or-self::

Die Achse - Durchsucht jeden Knoten darunter und den Knoten selbst. Es ist oft besser, das 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 Wildcard-Match, und/bla/a ist ein absoluter Pfad.

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

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

16
1729

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

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

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

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

4
DevDude

Haben Sie etwas ausprobiert wie:

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

Ich habe die Enthält-Funktion noch nie benutzt, aber ich habe den Verdacht, dass sie wie angekündigt funktionieren sollte ...

4
toddk

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

2
David Hill

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

1
digiguru

versuche dies:

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

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

1
Dani Duran