2009-06-14 14 views
30

In einem XML-Dokument habe ich Elemente, die denselben Namen haben, aber der Wert eines Attributs definiert, um welche Art von Daten es sich handelt, und ich möchte alle diese 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?SimpleXML: Auswählen von Elementen, die einen bestimmten Attributwert haben

Hier einige 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 <data> Tags Kinder von <object> wählen, die Art me ist ist.

PS - Ich versuche, mit der Netflix-API mit PHP zu interagieren - das sollte für meine Frage nicht wichtig sein, aber wenn Sie einen guten/besseren Weg vorschlagen möchten, bin ich ganz Ohr.

+0

X-Ref: [Implementierungsbedingung in XPath] (http://stackoverflow.com/q/3448005/367456) – hakre

Antwort

44

Versuchen Sie, diese XPath:

/object/data[@type="me"] 

So:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]'); 

Und wenn object nicht die Wurzel des Dokuments ist, verwenden Sie //object/data[@type="me"] statt.

+4

danke, dass Sie die vollständige php-Zeile und nicht nur die xpath-Zeichenfolge einschließen. Sie können nie über Dinge wie, ob es Anführungszeichen erfordert, und andere Sachen wie das über den Umfang eine Sache wie die Xpath-Zeichenfolge erzählen. Das Sehen von Dingen im Kontext liefert wichtige Informationen, die Sie nicht erraten können, wenn Sie es nicht bereits wissen. – ahnbizcad

4

Ich habe gerade eine Funktion gemacht, dies für mich zu tun; es ergreift jedoch nur das erste Ergebnis. Ihre Laufleistung kann variieren.

function query_attribute($xmlNode, $attr_name, $attr_value) { 
    foreach($xmlNode as $node) { 
    switch($node[$attr_name]) { 
     case $attr_value: 
     return $node; 
    } 
    } 
} 

Usage:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name; 

(Für die XML unten)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root> 
+11

Warum nicht den vorgeschlagenen XPath Gumbo verwenden? Und warum sollte man einen Schalter anstelle des leichter zu lesenden 'if ($ node [$ attr_name] == $ attr_value)' verwenden? – dimo414

Verwandte Themen