بحاجة الى بعض المساعدة مع تحليل 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
?>
المحلول
XPath بسيط جدا بمجرد الحصول على تعليق منه
تريد أساسا الحصول على كل علامة تطابق مع سمة معينة
//match[@streaming=1]
ستعمل Pefectly، فإنه يحصل على كل علامة تطابق من أسفل العلامة الأصل مع تدفق السمة يساوي 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/>';
}
لطباعة جميع أسماء المطابقة.
نصائح أخرى
لا أعرف كيفية العمل 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>";
}
}
}
}
?>
التي تجعلك إلى علامة "المباراة" التي تحتوي على سمة "تدفق". أنا لا أعرف حقا ما هي "مباريات اليوم"، سواء، ولكن ...
انها أساسا الحق خارج مرجع W3C:http://www.w3schools.com/php/php_ref_simplexml.asp.
أنا أستخدم هذا في مشروع. كشط احتمالات 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. تشغيله مرة واحدة في الدقيقة، يعمل بشكل رائع حتى الآن.