2010-04-15 3 views
0

Grâce à AakashM, il m'a conduit dans la bonne direction. Pour la question ci-dessous, c'est l'expression XPath qui m'a conduit la bonne façon:Comment sélectionner tous les éléments parentaux en fonction de l'attribut d'un noeud donné dans xPath de php?

"//channel/item[category[@domain='http://www.somelink.com/?category=4']]" 

Original post:

J'ai un flux XML qui ressemble à ceci (extrait):

<channel> 
    <title>Channel Name</title> 
    <link>Link to the channel</link> 

    <item> 
     <title>Heading 1</title> 
     <link>http://www.somelink.com?id=100</link> 
     <description><![CDATA[ Text here ]]></description> 
     <publishDate>Fri, 03 Apr 2009 10:00:00</publishDate> 
     <guid>http://www.somelink.com/read-story-100</guid> 
     <category domain="http://www.somelink.com/?category=4">Category 1</category> 
    </item> 

    <item> 
     <title>Heading 2</title> 
     <link>http://www.somelink.com?id=110</link> 
     <description><![CDATA[ Text here ]]></description> 
     <publishDate>Fri, 03 Apr 2009 11:00:00</publishDate> 
     <guid>http://www.somelink.com/read-story-110</guid> 
     <category domain="http://www.somelink.com/?category=4">Category 1</category> 
    </item> 

    <channel> 

Voilà à peu près tout. J'utilise ce morceau de PHP (extrait):

$xml = simple_xml_load_file($xmlFile); 
$xml->xpath($pattern); 

Maintenant, je veux obtenir tous ITEM-nœuds (avec leurs enfants) sur cette base satanés « domaine » attribut dans le nœud de la catégorie, mais peu importe ce que j'essaie ça ne marche pas-.

Le plus proche je suis arrivé était "// catégorie [@ domain = 'http://www.somelink.com/?category=4']"

L'expression que j'ai essayé m'a donné ce résultat:

[0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [domain] => http://www.somelink.com/?category=4 
       ) 

      [0] => Category 1 

[1] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [domain] => http://www.somelink.com/?category=4 
       ) 

      [0] => Category 1 

L'expression doit contenir tous les enfants des deux éléments dans l'exemple, mais comme vous pouvez voir que l'information dans le nœud de la catégorie est présent, je veux tous les nœuds de l'élément.

Toute aide serait grandement appréciée.

Répondre

1

(Essayez et évitez d'utiliser // lorsque vous savez que la structure de votre xml)

Donc, vous voulez tous item nœuds qui ont un noeud enfant category qui à son tour a un attribut domain avec une valeur particulière:

/channel/item[category[@domain='http://www.somelink.com/?category=4']] 
+0

Merci pour la réponse! L'expression a couru sans erreurs, mais le jeu de retour est vide. :/ – Coreus

+0

@bakkelun - Très probablement, vous devrez ajouter des noms d'éléments supplémentaires au début du chemin pour correspondre à votre structure XML. (Par exemple, si votre 'channel' est enveloppé dans un' feed', le chemin xpath devrait être changé en '/ feed/channel/item [...]'.) Pour tester, vous pouvez également le changer temporairement en '// channel/élément [...] '. –

+0

@bakkelun, oops J'avais 'child' dans l'expression où je voulais dire' category'. Édité; Essayez-le maintenant? – AakashM

Questions connexes