In einem XML-Dokument habe ich Elemente mit demselben Namen, aber der Wert eines Attributs definiert, um welche Art von Daten es sich handelt, und ich möchte alle Elemente auswählen, die einen bestimmten Wert aus dem Dokument haben. Muss ich XPath verwenden (und wenn ja, könnten Sie die richtige Syntax vorschlagen) oder gibt es eine elegantere Lösung?
Hier ist ein Beispiel-XML:
<object>
<data type="me">myname</data>
<data type="you">yourname</data>
<data type="me">myothername</data>
</object>
Und ich möchte den Inhalt aller auswählen <data>
Tags Kinder von <object>
wer ist typ me
.
PS – Ich versuche, mit PHP eine Schnittstelle zur Netflix-API herzustellen – dies sollte für meine Frage keine Rolle spielen, aber wenn Sie einen guten/besseren Weg vorschlagen möchten, bin ich ganz Ohr.

Gumbo
Versuchen Sie diesen XPath:
/object/data[@type="me"]
Was sich wie folgt liest:
- Auswählen (
/
) Kinder des aktuellen aufgerufenen Elements object
- Auswählen (
/
) riefen ihre Kinder an data
- Filtern (
[...]
), die Elemente auflistet, in denen …
- das Attribut
type
(der @
bedeutet “Attribut”)
- hat den Textwert
me
Damit:
$myDataObjects = $simplexml->xpath('/object/data[@type="me"]');
Wenn object
nicht das Stammverzeichnis Ihres Dokuments ist, möchten Sie vielleicht verwenden //object/data[@type="me"]
stattdessen. Die //
bedeutet „alles finden Nachkommen” statt “alle Kinder finden”.

willbradley
Ich habe gerade eine Funktion erstellt, die dies für mich erledigt; Es erfasst jedoch nur das erste Ergebnis. Ihr Kilometerstand kann variieren.
function query_attribute($xmlNode, $attr_name, $attr_value) {
foreach($xmlNode as $node) {
if($node[$attr_name] == $attr_value) {
return $node;
}
}
}
Verwendungszweck:
echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name;
(Für das XML unten)
<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root>
9892600cookie-checkSimpleXML: Auswählen von Elementen, die einen bestimmten Attributwert habenyes
X-Ref: Implementierende Bedingung in XPath
– hakre
9. Juli 2013 um 9:43 Uhr