2016-11-28 8 views
0

XMLフィードを取得するのにSimpleXMLを使用しています。同じ名前の2番目のノードを取得する必要があります。SimpleXML、ブラケットシンテックス付き子インデックスを使用してノードを選択

フィードの例は次のとおりです。

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

私が使用ハイフンをターゲットとしていたノードが、私はブラケットの構文を使用する必要があるので

$item->{'parent-node'}->{'child-node'}->{'the-node'} ブラケットを使用する場合はこれが最初<the-node>

をつかむだろう構文、私は次のいずれかを使用して<the-node><the-target>を選択できません...

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

<the-node><target>をつかむためにブラケットの構文を使用しながら、私の質問は、どのように私はchildIndexにを対象としますか?

--- --- UPDATES答えのいくつかの後

が、私は運

$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

あなたが試したことと失敗したことを共有できますか? –

+0

ちょうどあなたが子ノードに配列としてあるかのようにアクセスしたいと思っていることを知っています。すなわち、索引付けは '0'で始まります。' [2] 'の代わりに' [1] 'を使用しようとしましたか?これは正しい構文です: '$ item - > {'親ノード'} - > {'子ノード'} - > {'ノード'} [2]' btw。 – segFault

答えて

0

で次のことを試してみましたSimpleXMLElementストアまるでそれらが配列であるかのように兄弟ノードを返します。これは、通常、値が0から始まるインデックスで格納されていることを示します。配列の最初の値はインデックス0から始まります。

この場合、第2兄弟ノードは、2の代わりにインデックス1を使用してのみアクセスできます。

また、他のXMLを省略した場合や、デフォルト以外の設定を使用している場合を除き、ルートレベルのノードをデフォルトでトラバースする必要はありません。

これを試してみてください:

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

をあなたの最初のコードは、配列アクセスせずに仕事をした場合に応じて、あなたもこれを試すことができます。

// 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

説明として:SimpleXMLElementはそれらを保存せず、特定のインターフェイスを実装することによってアクセスを提供します。 'ArrayAccess'はブラケット/配列の構文を使用できます、' Traversable'は 'foreach'ループを許可します。これらのインタフェースは独自のクラスに実装することもできます。 – ThW

0

正しい構文は次のようになります。

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

parent-nodeが他のすべてのルート要素である場合、アクセスできませんそれは明示的です。

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

上記のコードでは、「非オブジェクトのプロパティを取得しようとしています」というエラーが発生します。

parent-nodeが最上位のルート要素であるため、明示的にアクセスすることはできません。

トップルート要素の直接の子要素のみが、SimpleXMLElementオブジェクトにアクセスするために利用できます。

関連する問題