2011-03-10 61 views
0

我在PHP中讀取XML文件時遇到了一些問題。我對PHP不太熟練,所以我使用這段代碼片段:Article在PHP中處理XML時只讀取第一個元素

這是我嘗試讀取XML文件:http://pastebin.com/2dtMp5VH

<?xml version="1.0" encoding="UTF-8"?> 
<contentdata> 
    <Games> 
    <numberof>2</numberof> 
     <nameof> 
      <n1>Game1</n1> 
      <n2>Game2</n2> 
     </nameof> 
    </Games> 
    <Software> 
    <numberof>1</numberof> 
     <nameof> 
      <n1>Software1</n1> 
     </nameof> 
    </Software> 
</contentdata> 

這是我的PHP腳本的基礎上,我給文章:http://pastebin.com/d29ejxSJ

$objDOM = new DOMDocument(); 
$objDOM->load("content.xml"); 
$note = $objDOM->getElementsByTagName("Games"); 

foreach($note as $value) 
{ 
    $numberof = $value->getElementsByTagName("numberof"); 
    $numberof_ = $numberof->item(0)->nodeValue; 
    echo($numberof_." games found!<br />"); 

    $numberof = (integer)$numberof_; 
    $nameof = $value->getElementsByTagName("nameof"); 
    $i = 1; 
    foreach($nameof as $value2) 
    { 
     $n = (string)$i; 
     $nameof_[$i] = $value2->getElementsByTagName("n".$n); 
     $nameof_[$i] = $nameof_[$i]->item(0)->nodeValue; 
     echo(((string)$i).": ".$nameof_[$i]."<br />"); 
     $i++; 
    } 
} 

輸出應該是這樣的:
找到2個遊戲!
1:的Game1
2:GAME2

但是,由於某種原因,只輸出如下:發現
2場比賽!
1:遊戲1

我的代碼有什麼問題?如何解決這個問題?

+0

你爲什麼不張貼在這裏的代碼? – Beaker 2011-03-10 09:59:37

+0

我試過了,但它給了一些奇怪的格式化結果。 – 2011-03-10 10:11:19

回答

0

我們需要看到你的XML,真正與這個幫助,但...

我想你可能是混亂的元素和屬性。簡單地說,XML是由這樣

<tagname attr1=5 attr2='arf'> BODY HERE </tagname> 

在你的情況,我不相信numberofnameof是在所有元素。它們似乎屬於Games元素。

使用回波或var_dump來顯示變量的內容,如$notes$numberof我想你會發現它們不包含你所期望的。

0

在$值中,您保留僅包含一個節點Games節點的參考。然後你製作

foreach($nameof as $value2) 

由於其中只有一個名稱的節點,因此它將被執行一次。你的$我會保持1,所以只打一場比賽。

你需要做的是選擇所有的「nX」節點並迭代它們,但不通過節點的名稱,因爲只有它們中的一個。或者,您可以更改for循環,以便完全按照numberof中所寫的那樣進行迭代。

1

就像@chris sayd,我想你在壞節點上做第二個foreach。 你的第二個目標foreachnameof,而不是他的內容(N1,N2,...)

用簡單的XML:

$Games = $value->getElementsByTagName("nameof")->children(); 
foreach($Games as $value2) 
{ 
    // Your code to parse <nX> 
} 
+0

謝謝* gg *,不熟悉php只檢查了算法:-) – Chris 2011-03-10 10:14:45

+0

請參閱http://php.net/manual/en/book.simplexml.php,Simple是解析XML的簡單方法。 – Akarun 2011-03-10 10:16:19

0

好像你的問題是通過在<nameof>的所有子元素迭代標籤。

嘗試以下操作:

foreach($nameof as $node){ 
    foreach($node->childNodes as $child) { 
     echo '<br/>Node Name: '.$child->nodeName.' Node Value: '.$child->nodeValue.'<br/>'; 
    } 
} 

,而不是你的最後foreach語句,並觀察輸出

0

你第二foreach是錯誤的,因爲它只有在Gamesnameof條目這是目前的一個條目後評估。

您需要使用您的nameof_你的情況進行迭代:

$objDOM = new DOMDocument(); 
$objDOM->load("content.xml"); 
$note = $objDOM->getElementsByTagName("Games"); 

foreach($note as $value) 
{ 
    $numberof = $value->getElementsByTagName("numberof"); 
    $numberof_ = $numberof->item(0)->nodeValue; 
    echo($numberof_." games found!<br />\n"); 

    $numberof = (integer)$numberof_; 
    $nameof = $value->getElementsByTagName("nameof"); 
    for ($i = 1; $i <= $numberof_; $i++) 
    { 
     $n = (string)$i; 
     $nameof_[$i] = $nameof->item(0)->getElementsByTagName("n".$n); 
     $nameof_[$i] = $nameof_[$i]->item(0)->nodeValue; 
     echo(((string)$i).": ".$nameof_[$i]."<br />\n"); 
    } 
} 

作爲諮詢看看你的數據定義細看樣@jon_darkstar建議作爲良好它看起來並不很XMLish(例如簡單的自動分析)。

比如你使用這種格式,解析會更加容易:

<?xml version="1.0" encoding="utf-8"?> 
<contentdata> 
    <Games> 
    <item name="Game1" /> 
    <item name="Game2" /> 
    </Games> 
    <Software> 
    <item name="Software1" /> 
    </Software> 
</contentdata> 

,你可以比使用解析

$objDOM = new DOMDocument(); 
$objDOM->load("content.xml"); 
$gamesElements = $objDOM->getElementsByTagName("Games"); 

foreach ($gamesElements as $gamesElement) 
{ 
    $itemElements = $gamesElement->getElementsByTagName("item"); 
    echo ($itemElements->length . " games found!<br />\n"); 

    $i = 1; 
    foreach ($itemElements as $itemElement) { 
     $name = $itemElement->attributes->getNamedItem('name')->nodeValue; 
     echo("$i: $name<br />\n"); 
     $i++; 
    } 
}