在PHP中处理XML时只读取第一个元素
我在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
我的代码有什么问题?如何解决这个问题?
我们需要看到你的XML,真正与这个帮助,但...
我想你可能是混乱的元素和属性。简单地说,XML是由这样
<tagname attr1=5 attr2='arf'> BODY HERE </tagname>
在你的情况,我不相信numberof
和nameof
是在所有元素。它们似乎属于Games
元素。
使用回波或var_dump
来显示变量的内容,如$notes
和$numberof
我想你会发现它们不包含你所期望的。
在$值中,您保留仅包含一个节点Games
节点的参考。然后你制作
foreach($nameof as $value2)
由于其中只有一个名称的节点,因此它将被执行一次。你的$我会保持1,所以只打一场比赛。
你需要做的是选择所有的“nX”节点并迭代它们,但不通过节点的名称,因为只有它们中的一个。或者,您可以更改for循环,以便完全按照numberof
中所写的那样进行迭代。
就像@chris sayd,我想你在坏节点上做第二个foreach
。 你的第二个目标foreach
:nameof
,而不是他的内容(N1,N2,...)
用简单的XML:
$Games = $value->getElementsByTagName("nameof")->children();
foreach($Games as $value2)
{
// Your code to parse <nX>
}
好像你的问题是通过在<nameof>
的所有子元素迭代标签。
尝试以下操作:
foreach($nameof as $node){
foreach($node->childNodes as $child) {
echo '<br/>Node Name: '.$child->nodeName.' Node Value: '.$child->nodeValue.'<br/>';
}
}
,而不是你的最后foreach
语句,并观察输出
你第二foreach
是错误的,因为它只有在Games
的nameof
条目这是目前的一个条目后评估。
您需要使用您的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++;
}
}
你为什么不张贴在这里的代码? – Beaker 2011-03-10 09:59:37
我试过了,但它给了一些奇怪的格式化结果。 – 2011-03-10 10:11:19