2010-03-18 6 views
0

J'ai une valeur d'attribut id pour un élément.aide avec xpath sélection

Je veux sélectionner uniquement ses enfants (pas tous les descendants).

i utilisé

$childElements = $xml->xpath('//entity[@id=212323]'); 
print_r($childElements); 

mais sélectionnerait tous les descendants et les imprimer. Je veux juste sélectionner les enfants de 1 génération. comment pourrais-je faire ça?

<entity id=212323> 
    <this>asd</this> 
    <this>asd</this> 
    <this>asd</this> 
    <this> 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
    </this> 
</entity> 

(provoque la hiérarchie est très longue, fecthing si tous les descendants ralentir le processus, et ce ne est pas intelligent pour récupérer les données inutiles).

+1

Bit d'un coup dans le noir, mais cela pourrait me faire un pas dans la bonne direction: '// entité [@ id = 212323]/child :: */text()' ou peut-être '// entity [@ id = 212323]/child :: */child :: text() ' –

+0

non il a toujours récupéré tous les éléments sous l'élément id. –

+2

Je pense que vous êtes malentendu. Lorsque vous imprimez un élément, vous l'imprimez et tous ses enfants, n'est-ce pas? Même si vous ne sélectionnez que les enfants de niveau supérieur, si vous les imprimez ... vous imprimez tout. vous devez repenser vos exigences. – Cheeso

Répondre

4

vous pouvez utiliser ceci:

//entity[@id=212323]/child::*[not(boolean(child::*))] 

pour sélectionner uniquement les nœuds qui n'ont pas d'enfants. Si ce n'est pas assez bon et vous attendez également des cas comme:

<entity id=212323> 
    <this>asd</this> 
    <this>asd</this> 
    <this>asd</this> 
    <this> 
     text node 1 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
     <notThis>asd</notThis> 
     text node 2 
    </this> 
</entity> 

Vous devriez faire plus de recherche. Dans cet exemple, text node 1 et text node 2 sont considérés comme des enfants de l'élément <this>. Vous devez savoir (je ne suis pas sûr si c'est possible) comment différer ces deux nœuds des autres (comme <notThis>asd</notThis>) dans votre expression xPath.