【问题标题】:simple xml read foreach简单的xml读取foreach
【发布时间】:2012-01-27 15:37:27
【问题描述】:

想知道你是否可以为圣诞节提供帮助。

我正在尝试读取 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
结果 ID:
结果 ID:
结果编号:6798861400
价格编号:
价格编号:24532283602
值:3.5
价值:5/2
价格编号:
结果编号:6798861200
价格编号:
价格编号:24532283402
价值:2.0
价值:1/1
价格编号:
结果编号:6798861300
价格编号:
价格编号:24532283502
值:3.6
价值:13/5
价格编号:

理想情况下,我只想返回以下内容:

事件 ID:298640100
活动日期:2011 年 12 月 31 日星期六 16:00:00 CET
结果编号:6798861400
价格编号:24532283602
值:5/2

任何想法我做错了什么以及如何实现这一目标。

提前致谢

理查德

【问题讨论】:

    标签: php xml foreach xml-parsing


    【解决方案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 />";
    }
    

    【讨论】:

    • 非常感谢您,我想我需要几天时间才能解决这个问题,非常感谢。有没有办法我也可以在描述中添加这个?我还想存储它以显示赔率是平局、赢还是输。例如。 博尔顿流浪者
    • 好吧,我相信如果你把 if ( $name != "price" ) 改成 if ( $name != "price" && $name != "description" ) 你可以得到描述也是如此。
    【解决方案2】:

    这里有 2 个问题。首先,您正在使用 children() 函数,它返回所有子项,而不仅仅是您想要的特定类型。这就是为什么你会在开始时获得 Outcome ID:3 次。你应该使用foreach ($market-&gt;outcome as $outcome),而不是foreach ($market-&gt;children() as $outcome)

    其次,您似乎只想要第一个结果。在这种情况下,您不应该使用 foreach。 simplexml 对象是一组数组,您可以通过其索引号访问数组中的单个对象。你可以去掉很多代码,直接获取第一个结果对象,如下所示:

    $xml->event->market->outcome[0]
    

    您可能想阅读官方的 simpleXML 文档http://www.php.net/manual/en/simplexml.examples-basic.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多