Нужна помощь с парсингом XML

Канал XML находится по адресу: http://xml.betclick.com/odds_fr.xml.

Мне нужен цикл php, чтобы повторить название матча, час, варианты ставок и ссылки на шансы. Функция будет выбирать и отображать ТОЛЬКО матчи дня с потоковой передачей = "1" и типом ставок "Ftb_Mr3".

Я новичок в xpath и simplexml.

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

Пока у меня есть:

<?php
$xml_str = file_get_contents("http://xml.betclick.com/odds_fr.xml");
$xml = simplexml_load_string($xml_str);

// need xpath magic
$xml->xpath();

// display

?>

person Yada    schedule 31.10.2009    source источник
comment
И что вы придумали до сих пор?   -  person cletus    schedule 31.10.2009
comment
как только я получу xpath, я смогу его зациклить. ‹?php $xml_str = file_get_contents($xml.betclick.com/odds_fr.xml); $xml = simplexml_load_string($xml_str); // нужна магия xpath $xml-›xpath(); // отображать ?>   -  person Yada    schedule 31.10.2009


Ответы (3)


Xpath довольно прост, как только вы его освоите

вы в основном хотите получить каждый тег соответствия с определенным атрибутом

//match[@streaming=1]

будет работать отлично, он получает каждый тег соответствия из-под родительского тега с потоковой передачей атрибута, равной 1

И я только что понял, что вам также нужны матчи с типом ставок "Ftb_Mr3"

//match[@streaming=1]/bets/bet[@code="Ftb_Mr3"]

Это вернет узел ставки, хотя нам нужно совпадение, которое, как мы знаем, является прародителем.

//match[@streaming=1]/bets/bet[@code="Ftb_Mr3"]/../..

две точки работают так же, как и в путях к файлам, и получают совпадение.

теперь, чтобы использовать это в своем образце, просто измените последний бит на

// need xpath magic
$nodes = $xml->xpath('//match[@streaming=1]/bets/bet[@code="Ftb_Mr3"]/../..');

foreach($nodes as $node) {
    echo $node['name'].'<br/>';
}

чтобы напечатать все имена совпадений.

person linead    schedule 31.10.2009
comment
Эй, это круто, и это имеет смысл. Спасибо! Я люблю w3schools, но для меня такие примеры обычно не имеют смысла, пока я не увижу практический пример, такой как постер выше, и ваш пример для него. Это странно, но я так учусь. Иногда меня это сводит с ума, потому что многие люди думают, что вы плохой программист, если вы не учитесь так же, как все остальные. В любом случае, не разглагольствую, но я немного дислексик, поэтому мне гораздо проще поговорить о чем-то для начала. Почему-то после этого как будто ключ открывает что-то, и я могу попасть в «стандартные» ссылки. - person George Sisco; 31.10.2009
comment
Это выражение XPath действительно должно быть //match[@streaming = "1"][bets/bet/@code = "Ftb_Mr3"] -- узел, который вы ищете, соответствует, а остальные являются предикатами, их следует рассматривать как таковые - person Josh Davis; 31.10.2009

Я не знаю, как на самом деле работать с xpath, но если вы хотите «зациклить», это должно помочь вам начать:

<?php
$xml = simplexml_load_file("odds_fr.xml");

  foreach ($xml->children() as $child)
  {
    foreach ($child->children() as $child2)
    {
      foreach ($child2->children() as $child3)
      {
        foreach($child3->attributes() as $a => $b)
        {
          echo $a,'="',$b,"\"</br>";
        }

      }
    }
  }
?> 

Это приведет вас к тегу «match», который имеет атрибут «streaming». Я тоже не знаю, что такое "матчи дня", но...

Это в основном прямо из ссылки w3c: http://www.w3schools.com/PHP/php_ref_simplexml.asp

person George Sisco    schedule 31.10.2009
comment
Прочтите мой другой комментарий. Я согласен. - person George Sisco; 01.11.2009

Я использую это в проекте. Сокращение коэффициентов Beclic с помощью:

<?php
        $match_csv = fopen('matches.csv', 'w');
        $bet_csv = fopen('bets.csv', 'w');
        $xml = simplexml_load_file('http://xml.cdn.betclic.com/odds_en.xml');
        $bookmaker = 'Betclick';
        foreach ($xml as $sport) {
            $sport_name = $sport->attributes()->name;
            foreach ($sport as $event) {
                $event_name = $event->attributes()->name;
                foreach ($event as $match) {
                    $match_name = $match->attributes()->name;
                    $match_id = $match->attributes()->id;
                    $match_start_date_str = str_replace('T', ' ', $match->attributes()->start_date);
                    $match_start_date = strtotime($match_start_date_str);
                    if (!empty($match->attributes()->live_id)) {
                        $match_is_live = 1;
                    } else {
                        $match_is_live = 0;
                    }
                    if ($match->attributes()->streaming == 1) {
                        $match_is_running = 1;
                    } else {
                        $match_is_running = 0;
                    }
                    $match_row = $match_id . ',' . $bookmaker . ',' . $sport_name . ',' . $event_name . ',' . $match_name . ',' . $match_start_date . ',' . $match_is_live . ',' . $match_is_running;
                    fputcsv($match_csv, explode(',', $match_row));
                    foreach ($match as $bets) {
                        foreach ($bets as $bet) {
                            $bet_name = $bet->attributes()->name;
                            foreach ($bet as $choice) {
                                // team numbers are surrounded by %, we strip them
                                $choice_name = str_replace('%', '', $choice->attributes()->name);
                                // get the float value of odss
                                $odd = (float)$choice->attributes()->odd;
                                // concat the row to be put to csv file
                                $bet_row = $match_id . ',' . $bet_name . ',' . $choice_name . ',' . $odd;
                                fputcsv($bet_csv, explode(',', $bet_row));
                            }
                        }
                    }
                }
            }
        }
        fclose($match_csv);
        fclose($bet_csv);
?>

Затем загрузите файлы csv в mysql. Запуская его раз в минуту, пока отлично работает.

person Calin Rusu    schedule 11.12.2014