不管你能为圣诞节提供帮助。
我正在尝试读取XML但是有一些问题,基本上foreach结构不允许我返回我想要的结构中的数据,而且我不确定这样做的正确方法。示例如下:
`<event id="298640100" date="Sat Dec 31 16:00:00 CET 2011">
<market id="9064667" type="1" status="Open" period="FT">
<description>Match Betting</description>
<place_terms>Win only</place_terms>
−
<outcome id="6798861400">
<description>Draw</description>
−
<price id="24532283602">
<decimal>3.5</decimal>
<fractional>5/2</fractional>
</price>
<position>2</position>
</outcome>
−
<outcome id="6798861200">
<description>Bolton Wanderers</description>
−
<price id="24532283402">
<decimal>2.0</decimal>
<fractional>1/1</fractional>
</price>
<position>1</position>
</outcome>
−
<outcome id="6798861300">
<description>Wolves</description>
−
<price id="24532283502">
<decimal>3.6</decimal>
<fractional>13/5</fractional>
</price>
<position>3</position>
</outcome>
</market>
</event>`
PHP
`<?php
$source = file_get_contents("vc.xml");
$xml = simplexml_load_string($source);
$game = $xml->xpath("//event");
foreach ($game as $event)
{
echo "<b>Event ID:</b> " . $event['id'] . "<br />";
echo "<b>Event Date:</b> " . $event['date'] . "<br />";
{
foreach ($event->children() as $market)
{
if ($market['period'] == 'FT')
{
foreach ($market->children() as $outcome)
{
echo "<b>Outcome ID:</b> " . $outcome['id'] . "<br />";
foreach ($outcome->children() as $price)
{
echo "<b>Price ID:</b> " . $price ['id'] . "<br />";
foreach ($price->children() as $value)
{
echo "<b>Value:</b> " . $value . "<br />";
}
}
}
}
}
}
echo "<br />";
}
?>`
这基本上归还了这个:
事件ID:298640100
活动日期:2011年12月31日星期六16:00:00 CET 2011年
结果ID:
结果ID:
结果ID:6798861400
价格ID:
价格ID:24532283602
价值:3.5
价值:5/2
价格ID:
结果ID:6798861200
价格ID:
价格ID:24532283402
价值:2.0
价值:1/1
价格ID:
结果ID:6798861300
价格ID:
价格ID:24532283502
价值:3.6
价值:13/5
价格ID:
理想情况下,我只想返回以下内容:
事件ID:298640100
活动日期:2011年12月31日星期六16:00:00 CET 2011年
结果ID:6798861400
价格ID:24532283602
价值:5/2
任何想法我做错了什么以及如何实现这一目标。
提前致谢
理查德
答案 0 :(得分:2)
这里有2个问题。首先,您使用的是children()函数,它返回所有子项,而不仅仅是您想要的特定类型。这就是为什么你得到结果ID:在开始时3次。您应该使用foreach ($market->children() as $outcome)
而不是foreach ($market->outcome as $outcome)
。
其次,看起来你只想要第一个结果。在这种情况下,你不应该使用foreach。 simplexml对象是一组数组,您可以通过索引号访问数组中的单个对象。你可以摆脱很多代码,直接抓住第一个结果对象:
$xml->event->market->outcome[0]
您可能需要阅读官方的simpleXML文档http://www.php.net/manual/en/simplexml.examples-basic.php
答案 1 :(得分:-1)
这是我认为你需要的:
foreach ($game as $event)
{
echo "<b>Event ID:</b> " . $event['id'] . "<br />";
echo "<b>Event Date:</b> " . $event['date'] . "<br />";
{
foreach ($event->children() as $market)
{
if ($market['period'] == 'FT')
{
foreach ($market->children() as $name => $outcome )
{
if ( $name != "outcome" )
{
continue;
}
echo "<b>Outcome ID: - $name</b> " . $outcome['id'] . "<br />";
foreach ($outcome->children() as $name => $price)
{
if ( $name != "price" )
{
continue;
}
echo "<b>Price ID:</b> " . $price ['id'] . "<br />";
foreach ($price->children() as $name => $value)
{
if ( $name != "fractional" )
{
continue;
}
echo "<b>Value: - $name</b> " . $value . "<br />";
break;
}
}
break;
}
break;
}
}
}
echo "<br />";
}