/ / SimpleXML, wybieranie węzła za pomocą indeksu potomnego ze składnią nawiasu - php, xml, simplexml

SimpleXML, wybieranie węzła za pomocą indeksu podrzędnego z syntezatorem nawiasów - php, xml, simplexml

Korzystam z SimpleXML, aby pobrać kanał XML. Muszę pobrać drugi węzeł o tej samej nazwie.

Przykładem kanału jest:

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

Ponieważ węzły, na które celuję, używają łączników, muszę użyć składni nawiasów

$item->{"parent-node"}->{"child-node"}->{"the-node"} To złapie pierwszy <the-node>

Podczas korzystania ze składni nawiasów nie mogę wybrać drugiej <the-node>"s <the-target> używając dowolnego z poniższych ...

$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"}

Moje pytanie brzmi: jak celować childIndex podczas korzystania ze składni nawiasu, aby pobrać drugą <the-node>"s <target>?

--- AKTUALIZACJE ---

Po kilku odpowiedziach spróbowałem następujących bez powodzenia

$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]

Odpowiedzi:

0 dla odpowiedzi № 1

SimpleXMLElement przechowuje węzły rodzeństwa tak, jakby były tablicą. Zazwyczaj oznacza to, że wartości są przechowywane z indeksem 0, tj. pierwsza wartość w tablicy zaczyna się od indeksu 0.

Tak więc w tym przypadku drugi węzeł rodzeństwa jest dostępny tylko przy użyciu indeksu 1 zamiast 2.

Do węzła poziomu głównego nie trzeba też przechodzić domyślnie (chyba że pominąłeś inny kod XML lub używasz ustawień innych niż domyślne).

Spróbuj tego:

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

W zależności od tego, czy początkowy kod działał bez dostępu do tablicy, możesz spróbować również:

// 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 dla odpowiedzi nr 2

Prawidłowa składnia wygląda następująco:

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

Gdyby parent-node jest elementem głównym wszystkich innych, nie można uzyskać do niego bezpośredniego dostępu.

$item->{"parent-node"}->{"child-node"}->{"the-node"}[0];

Powyższy kod spowoduje błąd „Próbuję uzyskać właściwość niebędącą przedmiotem”.

Od parent-node jest najwyższym elementem głównym, nie można uzyskać do niego bezpośredniego dostępu.

Tylko bezpośredni element potomny górnego elementu głównego będzie dostępny do dostępu w obiekcie SimpleXMLElement.