2016-11-28 1 views
0

Ich benutze SimpleXML, um einen XML-Feed einzuziehen. Ich muss den zweiten Knoten mit dem gleichen Namen greifen.SimpleXML, Auswählen von Knoten unter Verwendung von Kindindex mit Klammer syntex

-Feed Beispiel ist:

<parent-node> 
    <child-node> 
     <the-node> 
      <the-target>Text</target> 
     </the-node> 
     <the-node> 
      <the-target>Text</target> 
     </the-node> 
    </child-node> 
</parent-node> 

Da die Knoten I Verwendung Bindestriche bin Targeting, ich brauche Klammer Syntax verwenden

$item->{'parent-node'}->{'child-node'}->{'the-node'} Dies wird die erste <the-node>

greifen, wenn die Halterung mit Syntax, ich kann nicht die zweite <the-node> 's <the-target> mit einem der folgenden ...

$item->{'parent-node'}->{'child-node'}->{'the-node[2]'}->{'the-target'}

$item->{'parent-node'}->{'child-node'}->{'the-node'[2]}->{'the-target'}

$item->{'parent-node'}->{'child-node'}->{'the-node'}[2]->{'the-target'}

Meine Frage ist, wie richte ich child, während die Klammer-Syntax mit der zweiten <the-node> ‚s <target> zu greifen?

--- --- UPDATES

Nachdem ich einige der Antworten, habe ich versucht, die folgenden ohne Glück

$item->{'parent-node'}->{'child-node'}->{'the-node'}[1]->{'the-target'}

$item->{'parent-node'}->{'child-node'}->{'the-node'}->{'the-target'}[1]

$item->{'child-node'}->{'the-node'}->{'the-target'}[1]

+0

Können Sie teilen, was Sie versucht haben und wie es gescheitert ist? –

+0

Nur damit Sie wissen, dass Sie auf die Kindknoten zugreifen wollen, als wären sie ein Array, dh die Indizierung beginnt bei '0'. Haben Sie versucht,' [1] 'anstelle von' [2] 'zu verwenden? Dies ist die richtige Syntax: '$ item -> {'Eltern-Knoten'} -> {'Kind-Knoten'} -> {'Der-Knoten'} [2]' BTW. – segFault

Antwort

0

SimpleXMLElement speichern s Geschwisterknoten als wären sie ein Array. Dies bedeutet normalerweise, dass die Werte mit einem 0-basierten Index gespeichert werden, d. Der erste Wert im Array beginnt bei Index 0.

In diesem Fall ist der zweite Geschwisterknoten nur über den Index 1 statt 2 erreichbar.

Auch der Root-Level-Knoten muss standardmäßig nicht durchlaufen werden (es sei denn, Sie haben andere XML-Dateien weggelassen oder einige nicht standardmäßige Einstellungen verwendet).

Try this:

// Will grab the 2nd <the-node/> 
$node = $item->{'child-node'}->{'the-node'}[1]; 

Je nachdem, ob Ihre ursprünglichen Code funktionierte ohne Array-Zugang, können Sie dies versuchen:

// Testing locally I was not able to use this and got an error 
// But maybe things are omitted in your question. 
$node = $item->{'parent-node'}->{'child-node'}->{'the-node'}[1]; 
+0

Zur Klarstellung: SimpleXMLElement speichert sie nicht - es bietet Zugriff durch die Implementierung bestimmter Schnittstellen. 'ArrayAccess' ermöglicht die Verwendung der Klammer-/Array-Syntax,' Traversable' erlaubt 'foreach'-Schleifen. Sie können diese Schnittstellen auch in Ihre eigenen Klassen implementieren. – ThW

0

Die korrekte Syntax sieht wie folgt aus:

$item->{'child-node'}->{'the-node'}[0]; // First the-node 
$item->{'child-node'}->{'the-node'}[1]; // Second the-node 

Wenn parent-node das Stammelement aller anderen ist, können Sie nicht darauf zugreifen s es explizit.

Der obige Code führt zu einem Fehler mit dem Hinweis "Versuch, die Eigenschaft eines Nicht-Objekts zu erhalten".

Da parent-node das oberste Stammelement ist, können Sie nicht explizit darauf zugreifen.

Nur das unmittelbar untergeordnete Element des obersten Stammelements ist für den Zugriff im SimpleXMLElement-Objekt verfügbar.

Verwandte Themen