2009-06-14 14 views
30

In un documento XML, ho elementi che condividono lo stesso nome, ma il valore di un attributo definisce il tipo di dati che è, e voglio selezionare tutti questi elementi che hanno un certo valore dal documento. Devo usare XPath (e in tal caso, potresti suggerire la sintassi corretta) oppure esiste una soluzione più elegante?SimpleXML: selezione di elementi che hanno un determinato valore di attributo

Ecco alcuni esempi di XML:

<object> 
    <data type="me">myname</data> 
    <data type="you">yourname</data> 
    <data type="me">myothername</data> 
</object> 

e voglio selezionare i contenuti di tutti i <data> tag figli di <object> Chi è tipo è me.

PS - Sto cercando di interfacciarmi con l'API di Netflix usando PHP - questo non dovrebbe essere importante per la mia domanda, ma se vuoi suggerire un modo migliore/migliore per farlo, sono tutto orecchie.

+0

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

risposta

44

Prova questa XPath:

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

Quindi:

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

E se object non è la radice del documento, utilizzare //object/data[@type="me"] invece.

+4

grazie per aver incluso la linea completa di wrapping php e non solo la stringa xpath. Non si può mai dire cose come se richieda virgolette, e altre cose come quella sull'oscilloscopio come la stringa xpath. Vedere le cose nel contesto fornisce informazioni critiche che non si possono indovinare se non lo si conosce già. – ahnbizcad

4

Ho appena creato una funzione per fare questo per me; tuttavia prende solo il primo risultato. Il tuo chilometraggio può variare.

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; 

(Per l'XML di seguito)

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

Perché non usare XPath Gumbo suggerito? E perché usare uno switch invece di leggere più facilmente 'if ($ node [$ attr_name] == $ attr_value)'? – dimo414

Problemi correlati