2009-06-14 8 views
30

En un documento XML, tengo elementos que comparten el mismo nombre, pero el valor de un atributo define de qué tipo de datos se trata, y quiero seleccionar todos esos elementos que tienen un cierto valor del documento. ¿Debo usar XPath (y si es así, podría sugerir la sintaxis correcta) o hay una solución más elegante?SimpleXML: Selección de elementos que tienen un cierto valor de atributo

He aquí algunos ejemplos XML:

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

y quiero seleccionar el contenido de todos los hijos de etiquetas <data><object> que su tipo es me.

PD - Estoy tratando de interactuar con la API de Netflix usando PHP - esto no debería importar para mi pregunta, pero si quiere sugerir una buena/mejor manera de hacerlo, soy todo oídos.

+0

X-Ref: [condición de ejecución en XPath] (http://stackoverflow.com/q/3448005/367456) – hakre

Respuesta

44

probar este XPath:

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

Así:

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

Y si object no es la raíz del documento, utilice //object/data[@type="me"] lugar.

+4

gracias por incluir la línea completa de php y no solo la cadena xpath. Nunca se puede hablar de cosas como si se requieren comillas, y otras cosas similares sobre el alcance, como la cadena xpath. Ver las cosas en contexto proporciona información crítica que no puedes adivinar si no la conoces. – ahnbizcad

4

Acabo de hacer una función para hacer esto por mí; sin embargo, solo agarra el primer resultado. Su experiencia puede ser diferente.

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

Uso:

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

(Para el XML a continuación)

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

¿Por qué no utilizar el XPath Gumbo sugerido? ¿Y por qué utilizar un conmutador en lugar de la más fácil de leer 'if ($ nodo [$ attr_name] == $ attr_value)'? – dimo414

Cuestiones relacionadas