Я работаю над проектом, в котором я делаю различные статистические данные о НХЛ и вставляю их в таблицу SQL. В настоящее время я работаю над фазой скремблирования и нашел XML-синтаксический анализатор, который я реализовал, но я не могу на всю жизнь понять, как извлечь информацию из него. Таблицу можно найти здесь -> http://www.tsn.ca/datafiles/XML/NHL/standings.xml . Парсер предположительно генерирует многомерный размер массива, и я просто пытаюсь вытащить все статистические данные из раздела «информационные команды», но я не знаю, как извлечь эту информацию из массива. Как бы я потянул за собой количество побед Монреаля? (Только в качестве примера для остальной статистики) Вот как выглядит страница в настоящее время -> http://mattegener.me/school/standings.php вот код:
<?php $strYourXML = "http://www.tsn.ca/datafiles/XML/NHL/standings.xml"; $fh = fopen($strYourXML, 'r'); $dummy = fgets($fh); $contents = ''; while ($line = fgets($fh)) $contents.=$line; fclose($fh); $objXML = new xml2Array(); $arrOutput = $objXML->parse($contents); print_r($arrOutput[0]); //This print outs the array. class xml2Array { var $arrOutput = array(); var $resParser; var $strXmlData; function parse($strInputXML) { $this->resParser = xml_parser_create (); xml_set_object($this->resParser,$this); xml_set_element_handler($this->resParser, "tagOpen", "tagClosed"); xml_set_character_data_handler($this->resParser, "tagData"); $this->strXmlData = xml_parse($this->resParser,$strInputXML ); if(!$this->strXmlData) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->resParser)), xml_get_current_line_number($this->resParser))); } xml_parser_free($this->resParser); return $this->arrOutput; } function tagOpen($parser, $name, $attrs) { $tag=array("name"=>$name,"attrs"=>$attrs); array_push($this->arrOutput,$tag); } function tagData($parser, $tagData) { if(trim($tagData)) { if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData'])) { $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData; } else { $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData; } } } function tagClosed($parser, $name) { $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this- >arrOutput)-1]; array_pop($this->arrOutput); } } ?>
добавьте эту функцию поиска в свой класс и играйте с этим кодом
$objXML = new xml2Array(); $arrOutput = $objXML->parse($contents); // first param is always 0 // second is 'children' unless you need info like last updated date // third is which statistics category you want for example // 6 => the array you want that has wins and losses print_r($arrOutput[0]['children'][6]); //using the search function if key NAME is Montreal in the whole array //result will be montreals array $search_result = $objXML->search($arrOutput, 'NAME', 'Montreal'); //first param is always 0 //second is key name echo $search_result[0]['WINS']; function search($array, $key, $value) { $results = array(); if (is_array($array)) { if (isset($array[$key]) && $array[$key] == $value) $results[] = $array; foreach ($array as $subarray) $results = array_merge($results, $this->search($subarray, $key, $value)); } return $results; }
берегись
эта функция поиска чувствительна к регистру, она нуждается в модификациях, таких как совпадение с процентом, ключ или значение, изменяющее капитал M в montreal в нижнем регистре, будет пустым
Вот код, который я отправил вам в действие. Вытягивание данных из той же самой ссылки, которую вы используете
http://sjsharktank.com/standings.php
Я фактически использовал тот же самый точный XML- файл для моего собственного школьного проекта. Я использовал документ DOM . Цикл foreach
получит значение каждого атрибута команды и сохранит значения. Код очистит содержимое таблицы, а затем снова вставляет данные. Я думаю, вы могли бы сделать инструкцию по обновлению, но это предполагает, что вы никогда не вводили данные в таблицу.
try { $db = new PDO('sqlite:../../SharksDB/SharksDB'); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { echo "Error: Could not connect to database. Please try again later."; exit; } $query = "DELETE FROM standings"; $result = $db->query($query); $xmlDoc = new DOMDocument(); $xmlDoc->load('http://www.tsn.ca/datafiles/XML/NHL/standings.xml'); $searchNode = $xmlDoc->getElementsByTagName( "team-standing" ); foreach ($searchNode as $searchNode) { $teamID = $searchNode->getAttribute('id'); $name = $searchNode->getAttribute('name'); $wins = $searchNode->getAttribute('wins'); $losses = $searchNode->getAttribute('losses'); $ot = $searchNode->getAttribute('overtime'); $points = $searchNode->getAttribute('points'); $goalsFor = $searchNode->getAttribute('goalsFor'); $goalsAgainst = $searchNode->getAttribute('goalsAgainst'); $confID = $searchNode->getAttribute('conf-id'); $divID = $searchNode->getAttribute('division-id'); $query = "INSERT INTO standings ('teamid','confid','divid','name','wins','losses','otl','pts','gf','ga') VALUES ('$teamID','$confID','$divID','$name','$wins','$losses','$ot','$points','$goalsFor','$goalsAgainst')"; $result= $db->query($query); }