xml tester - Was ist der korrekte XPath zum Auswählen von Attributen, die "foo" enthalten?




beispiele php (9)

Bei diesem XML gibt XPath alle Elemente zurück, deren prop Attribut Foo (die ersten drei Knoten) enthält:

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

Answers

Dieser XPath gibt Ihnen alle Knoten mit Attributen, die 'Foo' enthalten, ungeachtet des Knotennamens oder Attributnamens:

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

Wenn Sie sich mehr für den Inhalt des Attributs und nicht unbedingt für den übergeordneten Knoten interessieren, löschen Sie einfach das / ..

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

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

Funktioniert, wenn ich dieses XML verwende, um Ergebnisse zurück zu erhalten.

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

Diese Seite ist großartig, um solche Dinge zu testen

http://www.xmlme.com/XpathTool.aspx

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

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

Dadurch werden Sie alle "a" -Elemente in Ihrem gesamten xml-Dokument durchsuchen, 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 Sinne von hinzugefügt. :)


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


descendant-or-self::*[contains(@prop,'Foo')]

Oder:

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

Oder:

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

Zergliedert:

descendant-or-self::

Die Achse - Durchsuche jeden darunterliegenden Knoten und den Knoten selbst. Es ist oft besser, dies zu sagen als //. Ich bin auf einige Implementierungen gestoßen, wo // irgendwo bedeutet (Abkömmling 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 eine Abkürzung für attribute :: prop, da Attribut eine andere Suchachse ist. Alternativ können Sie die ersten 3 mit der Funktion position () auswählen.


Hast du etwas versucht wie:

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

Ich habe die contains-Funktion vorher noch nie benutzt, vermute aber, dass sie wie angekündigt funktionieren sollte ...


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


Versuche dies:

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

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


John C ist am nächsten, aber XPath unterscheidet zwischen Groß- und Kleinschreibung. Daher lautet der korrekte XPath:

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

Zusätzlich zu XML :: XSH und XML :: XSH2 gibt es einige grep ähnliche Hilfsprogramme wie App::xml_grep2 und XML::Twig (die xml_grep statt xml_grep2 ). Diese können sehr nützlich sein, wenn Sie an einer großen oder zahlreichen XML-Dateien für schnelle Oneliner oder Makefile Ziele arbeiten. XML::Twig eignet sich besonders gut für perl Scripting-Ansätze, wenn Sie ein wenig mehr Verarbeitung als Ihr $SHELL und xstlproc Angebot xstlproc .

Das Nummerierungsschema in den Anwendungsnamen zeigt an, dass die "2" -Versionen eine neuere / spätere Version von im Wesentlichen demselben Werkzeug sind, das möglicherweise spätere Versionen anderer Module (oder von perl selbst) erfordert.





xml xpath