2017-05-11 11 views
0

PHP内で、同じ名前の複数のノードが親の中にあるXMLファイルを読み込もうとしています。これまでは、XMLノードの最初の反復を読むことができますが、読み込まれる別の子があるにもかかわらず、PHPは次の親に移動します。この場合、ノードは<DEVICE>であり、ノードの子ノードは<IPV4>です。PHP XMLから複数の子を反復する

は、ここにあなたが見ることができるように、「ブラボー」の会社の下に「アルファ」の会社と1の下にリストされている2つのデバイスがあるXML(pass1.xml)

<LIST> 
<COMPANY>Alpha 
    <DEVICE>Alpha1 
    <IPV4>1.2.3.4</IPV4> 
    </DEVICE> 
    <DEVICE>Alpha2 
    <IPV4>5.6.7.8</IPV4> 
    </DEVICE> 
</COMPANY> 
<COMPANY>Bravo 
    <DEVICE>Bravo1 
    <IPV4>1.3.5.7</IPV4> 
    </DEVICE> 
</COMPANY> 
</LIST> 

です。ここでは(私はHTMLタグを省略しました)私のPHPです:

 $xml = simplexml_load_file("/var/www/xml/pass1.xml") or die ("Could not open file!"); 

     // Get Companies 
     echo "Company List<br>"; 
     foreach($xml->children() as $company) { 
       echo $company . "<br>"; 
     } 

     echo "<br>Device List<br>"; 

     // Get devices 
     foreach($xml->children() as $device) { 
       echo $device->DEVICE . "<br>"; 
     } 

    echo "<br>IP List<br>"; 

    // Get IP 
    foreach($xml->children() as $ipv4) { 
      echo $ipv4->DEVICE->IPV4 . "<br>"; 
    } 

「企業は」適切に引っ張られたが、「デバイス」のためにしている私はAlpha1Bravo1を取得します。同様に、IPアドレスの場合、私は引っ張られるデバイスに対応する1.2.3.41.3.5.7しか得ません。 Alpha2に関する情報が不足しています。

私の究極の目標は、それぞれDeviceIPv4をPHPから繰り返して表示することです。誰かが私を正しい方向に向けることができますか?

答えて

1

これを行うにはより良い方法があると確信していますが、このコードは自分のものが正しく動作しなかった理由を説明しています。

// Get Companies 
    echo "Company List<br>"; 
    foreach($xml->children() as $company) { 
      echo $company . "<br>"; 
    } 

    echo "<br>Device List<br>"; 

    // Get devices 
    foreach($xml->children() as $company) { 
     foreach ($company->children() as $device) { 
      echo $device . "<br>"; 
     } 
    } 

    echo "<br>IP List<br>"; 

    // Get IP 
    foreach($xml->children() as $company) { 
      foreach ($company->children() as $device) { 
       foreach ($device->children() as $IPV4) { 
        echo $IPV4 . "<br>"; 
       } 
      } 
    } 

あなたのコードの問題は、各ループに別の情報を引き出すためにしようとしているということですが、あなたのコードは、実際には、繰り返しの最初の子を引っ張っています。

だからここ

// Get devices 
    foreach($xml->children() as $device) { 
      echo $device->DEVICE . "<br>"; 
    } 

あなたはXMLファイルから各デバイスを取得しようとしているが、実際にあなたがCOMPANYタグです$のXMLからFIRST子どもたちのすべてを引っ張っていると、最初の二つCOMPANYタグはAlphaとBravoです。その後、1つのデバイスタグをエコーし​​ている2つの会社タグのそれぞれを使用します。

これで、AlphaのSINGLE DEVICEタグとBravoのSINGLE DEVICEタグが表示されます。そのため、解決策はforeachに別のレイヤーを追加し、2つのCOMPANYタグをループした後、DEVICEタグであるCOMPANYタグの子レイヤーをループします。

次に、IPV4では同じことを行いますが、別のループレイヤーを追加します。

+0

素晴らしい!それは魅力のように働いた。一度あなたが私のために説明したらそれは意味をなさない。ありがとう! :) –

関連する問題