/ / SimpleXML, selecionando o nó usando índice filho com colchetes syntex - php, xml, simplexml

SimpleXML, selecionando o nó usando o índice filho com colchete syntex - php, xml, simplexml

Eu estou usando o SimpleXML para puxar um feed XML. Eu preciso pegar o segundo nó com o mesmo nome.

O exemplo de feed é:

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

Como os nós que eu estou segmentando usam hifens, preciso usar a sintaxe de colchetes

$item->{"parent-node"}->{"child-node"}->{"the-node"} Isso vai pegar o primeiro <the-node>

Ao usar a sintaxe de colchetes, não consigo selecionar o segundo <the-node>"s <the-target> usando qualquer um dos seguintes ...

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

Minha pergunta é: como segmentar childIndex ao usar a sintaxe de colchetes para capturar o segundo <the-node>"s <target>?

--- ATUALIZAÇÕES ---

Depois de algumas das respostas, eu tentei o seguinte sem sorte

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

Respostas:

0 para resposta № 1

SimpleXMLElement armazena nós irmãos como se fossem um array. Isso geralmente indica que os valores são armazenados com um índice baseado em 0, ou seja. o primeiro valor na matriz começa no índice 0.

Portanto, neste caso, o segundo nó irmão só é acessível usando o índice 1 ao invés de 2.

Além disso, o nó de nível raiz não precisa ser percorrido por padrão (a menos que você tenha omitido algum outro XML ou esteja usando algumas configurações não padrão).

Tente isto:

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

Dependendo se o seu código inicial funcionou sem o acesso à matriz, você pode tentar também:

// 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 para resposta № 2

A sintaxe correta é semelhante à seguinte:

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

E se parent-node é o elemento raiz de todos os outros, você não pode acessá-lo explicitamente.

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

O código acima resultará em erro dizendo "Tentando obter propriedade de não objeto".

Desde a parent-node é o elemento raiz superior, você não pode acessá-lo explicitamente.

Somente o elemento filho imediato do elemento raiz superior estará disponível para acesso no objeto SimpleXMLElement.