простое xml чтение foreach - PullRequest
       9

простое xml чтение foreach

0 голосов
/ 25 декабря 2011

Интересно, сможете ли вы помочь на Рождество?

Я пытаюсь прочитать 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 />";
}
?>`

Это в основном возвращает это:

Идентификатор события: 298640100
Дата события: сб. 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 цены:
OutcomeID: 6798861300
ID цены:
ID цены: 24532283502
Значение: 3,6
Значение: 13/5
ID цены:

В идеале я просто хочу вернуть следующее:

ID события: 298640100
Дата события: сб. 31 декабря 16:00:00 CET 2011
ID результата: 6798861400
ID цены: 24532283602
Значение: 5/2

Любые идеи, что я делаю неправильно и как я могу этого достичь.

Заранее спасибо

Ричард

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

У вас есть 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

0 голосов
/ 25 декабря 2011

Вот что мне нужно:

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 />";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...