2009-06-14 11 views
30

Dans un document XML, j'ai des éléments qui partagent le même nom, mais la valeur d'un attribut définit quel type de données il est, et je veux sélectionner tous ces éléments qui ont une certaine valeur du document. Dois-je utiliser XPath (et si oui, pourriez-vous suggérer la bonne syntaxe) ou existe-t-il une solution plus élégante?SimpleXML: Sélection d'éléments ayant une certaine valeur d'attribut

Voici quelques XML exemple:

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

Je veux choisir le contenu de tous les tags <data> enfants de <object> qui est le type est me. PS - J'essaie d'interagir avec l'API Netflix en utilisant PHP - cela ne devrait pas poser de problème pour ma question, mais si vous voulez suggérer un bon/meilleur moyen de le faire, je suis tout ouïe.

+0

X-Ref: [condition mise en œuvre en XPath] (http://stackoverflow.com/q/3448005/367456) – hakre

Répondre

44

Essayez cette XPath:

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

Alors:

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

Et si object n'est pas la racine de votre document, utilisez //object/data[@type="me"] à la place.

+4

merci d'inclure la ligne php enveloppante complète, et pas seulement la chaîne xpath. Vous ne pouvez jamais dire à propos de choses comme si elle nécessite des guillemets, et d'autres choses comme ça sur la portée d'une chose comme la chaîne xpath. Voir les choses en contexte fournit des informations critiques que vous ne pouvez pas deviner si vous ne le connaissez pas déjà. – ahnbizcad

4

Je viens de faire une fonction pour faire cela pour moi; il ne saisit que le premier résultat. Votre kilométrage peut varier.

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

Utilisation:

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

(Pour le XML ci-dessous)

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

Pourquoi ne pas utiliser le XPath Gumbo suggéré? Et pourquoi utiliser un commutateur plutôt que le plus facile à lire 'if ($ node [$ attr_name] == $ attr_value)'? – dimo414

Questions connexes