2011-03-10 62 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++; 
    } 
}