2009-07-28 30 views
1
<?php 
$xmlstr = <<<XML 
<books> 
    <book> 
     <title>Great American Novel</title> 
     <plot> 
     Cliff meets Lovely Woman. 
     </plot> 
     <success type="bestseller">4</success> 
     <success type="bookclubs">9</success> 
    </book> 
    <book> 
     <title>Man Bites Dog</title> 
     <plot> 
     Reporter invents a prize-winning story. 
     </plot> 
     <success type="bestseller">22</success> 
     <success type="bookclubs">3</success> 
    </book> 
</books> 
XML; 
?> 


<?php 

$xml = new SimpleXMLElement($xmlstr); 

foreach ($xml->book[0]->success as $success) { 
    switch((string) $success['type']) { 
    case 'bestseller': 
     echo $success, ' months on bestseller list<br />'; 
     break; 
    case 'bookclubs': 
     echo $success, ' bookclub listings<br />'; 
     break; 
    } 
} 

?> 

私はこのコードをチュートリアルサイトから貼り付けるので、うまくいきます。私自身の手段でそれを変更しようとしています。しかし、私はそれが私が望むことをすることはできません。私が印刷しようとしているのは、最初のインスタンスだけでなく、すべての成功のタイプです。 このxmlフィードには本、タイトルが2つしかありません。解析しようとしているxmlフィードはもっと多くありますが、構造は同じで、印刷するのは4と9です最初の本のタイトル。PHPでのXMLの解析

答えて

2

あなたのコードは最初の本(book [0])だけを繰り返します。最初にすべての書籍を反復処理するには、それを変更する必要があります。

foreach ($xml->book as $book){ 
    foreach ($book->success as $success) { 
    switch((string) $success['type']) { 
4

この行はあなたの問題です:

foreach ($xml->book[0]->success as $success) 

あなたが "ブック[0]" とブース配列の最初の要素を参照します。 「あなたはstackoverflowの上で入力したコードの各行は、4つのスペース以上でインデントされているので、サイトが実現し、それはコードとのdoesnであることを確認し、サイドノート、

foreach ($xml->book as $book) { 
    foreach($book->success as $success) { 
     // switch/case goes here 
    } 
} 

また:あなたは次のようにこれを変更する必要があります

1

print_r()を使用して、SimpleXMLオブジェクトのほぼすべてのセクションをデバッグすることができます。

+0

あなたのXMLが名前空間を持っていない限り、あなたはまったくの他のセットに入ります。 –