XML error: SYSTEM or PUBLIC, the URI is missing at line 1

Discussion in 'XML & RSS' started by ksunmn, Jan 22, 2009.

  1. #1
    Hello!

    I am kinda stuck on this script.
    This is the original script
    <?php
    $clanid="6349";
    
    function startTag($parser, $name, $attrs) {
     global $stack;
    
     $tag=array("name"=>$name,"attrs"=>$attrs); 
     array_push($stack,$tag);
    }
    
    function cdata($parser, $cdata) {
     global $stack;
    
     $stack[count($stack)-1]['cdata'] .= $cdata;   
    }
    
    function endTag($parser, $name) {
     global $stack;
    
     $stack[count($stack)-2]['children'][] = $stack[count($stack)-1];
     array_pop($stack);
    }
    
    
    // Parse XML
    
    $stack = array();
    $claninfo = array();
    $clanstats = array();
    $playerstats = array();
    
    $xml_parser = xml_parser_create();
    xml_set_element_handler($xml_parser, "startTag", "endTag");
    xml_set_character_data_handler($xml_parser, "cdata");
    
    $xmllink="http://bf2tracker.com/livefeed/xml_clanprofile.php?clanid=$clanid";
    $data = xml_parse($xml_parser,file_get_contents($xmllink));
    if(!$data) die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
    
    xml_parser_free($xml_parser);
    
    
    // Get Data
    
     // Get Clan Profile Data
     for($i = 0; $i < sizeof($stack[0][children][0][children]); $i++) {
      $valname=$stack[0][children][0][children][$i][name];
      $claninfo[$valname]=$stack[0][children][0][children][$i][cdata];
     }
    
     // Get Clan Stats Data
     for($i = 0; $i < sizeof($stack[0][children][1][children]); $i++) {
      $valname=$stack[0][children][1][children][$i][name];
      $clanstats[$valname]=$stack[0][children][1][children][$i][cdata];
     }
    
     // Get Player Data
     for($i = 0; $i < sizeof($stack[0][children][2][children]); $i++) {
      for($x = 0; $x < sizeof($stack[0][children][2][children][$i][children]); $x++) {
       $valname=$stack[0][children][2][children][$i][children][$x][name];
       $value=$stack[0][children][2][children][$i][children][$x][cdata];
       if($valname=="PLAYERID") $pid=$value;
       $playerstats[$pid][$valname]=$value;
      }
     }
     
    
    
    // Now we have 3 arrays with all stats and infos
    // print_r($claninfo);
    //print_r($clanstats);
    // print_r($playerstats);
    
    // Prepare table for info/stats
    echo "<table align=\"center\" cellpadding=\"2\" cellspacing=\"0\">\n
    	  <tr><th colspan=\"12\">Clan info/statistics</td></tr>\n
    	  <tr><th>ID</td>\n
    	  <th>Name</td>\n
    	  <th>Tag</td>\n
    	  <th>CO</td>\n
    	  <th>Score</td>\n
    	  <th>TM</td>\n
    	  <th>WM</td>\n
    	  <th>LM</td>\n
    	  <th>Kills</td>\n
    	  <th>KillAs.</td>\n
    	  <th>Deaths</td>\n
    	  <th>Ratio</td>\n
    	  </tr>\n";	  
    
    //get clan info
    foreach($claninfo as $key => $value) {
    	$clanname=$claninfo[CLANNAME];
    	$clanid=$claninfo[CLANID];
    	$clanurl=$claninfo[CLANSTATSURL];
    	$clantag=$claninfo[CLANTAG];
    	$clanCO=$claninfo[CLANCOUNTRY];
    }
    
    // get Clan Stats
    	  
    foreach($clanstats as $key => $value) {
     	$clanK=$clanstats[KILLS];
     	$clanKA=$clanstats[KILLASS];
     	$clanD=$clanstats[DEATHS];
     	$clanGS=$clanstats[SCORE];
     	$clanRATIO=$clanstats[KDRATIO];
     	$clanMA=$clanstats[MATCHES];
     	$clanWI=$clanstats[WINS];
     	$clanLO=$clanstats[LOSS];
    }
    
    //show in table
    echo "<tr class=\"gen\">\n
     	  	<td  align=\"center\" class=\"row1\">$clanid</a></td>\n
     	  	<td class=\"row1\"><a target=\"_blank\" href=\"$clanurl\">$clanname</a></td>\n
     	  	<td class=\"row1\">$clantag</td>\n
     	  	<td class=\"row1\">$clanCO</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanGS</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanMA</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanWI</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanLO</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanK</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanKA</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanD</td>\n
     	  	<td align=\"right\" class=\"row1\">$clanRATIO</td>\n
          </tr>\n
          </table>";
    
    
    // Prepare Player Stats table
    echo "<table align=\"center\" cellpadding=\"2\" cellspacing=\"0\">\n
    	   <tr><th colspan=\"12\">Player Stats</td></tr>\n
    	   <tr>\n";
    	   
    // remove/add pictures depending how many members you have in your clan. 
    // Also change the rowspan to suit. remove the first cell if you dont want the pics at all	   
    echo "   <td width=\"150\" align=\"left\" rowspan=\"50\" valign=\"top\" class=\"row2\">\n
    	        <img border=\"0\" src=\"images/support.jpg\" width=\"150\" height=\"224\">\n
    	        <img border=\"0\" src=\"images/assault.jpg\" width=\"150\" height=\"224\">\n
    	        <img border=\"0\" src=\"images/special_opps.jpg\" width=\"150\" height=\"224\">\n
    	        <img border=\"0\" src=\"images/anti_tank.jpg\" width=\"150\" height=\"224\">\n
              <img border=\"0\" src=\"images/sniper.jpg\" width=\"150\" height=\"224\">\n 
    	     </td>\n
    	     <th>Rank</td>\n
    	     <th>Status</td>\n
    	     <th>Name</td>\n
    	     <th>CO</td>\n
    	     <th>GS</td>\n
    	     <th>TM</td>\n
    	     <th>WM</td>\n
    	     <th>LM</td>\n
    	     <th>TT</td>\n
    	     <th>SM</td>\n
    	     <th>SH</td>\n
    	  </tr>\n";
    	  
    $row="row2";
    //sorting by global score
    function sort_by_gscore($a, $b) {return strnatcmp($b["PLAYERGLOBALSCORE"],$a["PLAYERGLOBALSCORE"]);}
    usort($playerstats,sort_by_gscore);
    // get player stats
    foreach($playerstats as $key => $value) {
     $playername=$playerstats[$key][PLAYERNAME];
     $playerurl=$playerstats[$key][PLAYERSTATSURL];
     $playerid=$playerstats[$key][PLAYERID];
     $playerGS=$playerstats[$key][PLAYERGLOBALSCORE];
     $playerCO=$playerstats[$key][PLAYERCOUNTRY];
     $playerMA=$playerstats[$key][PLAYERMATCHES];
     $playerWI=$playerstats[$key][PLAYERWINS];
     $playerLO=$playerstats[$key][PLAYERLOSS];
     $playerTI=$playerstats[$key][PLAYERTIME];
    
    // average score/match 
     if ($playerGS>0) $avescore=round($playerGS/$playerMA, 1); 
     else $avescore="N/A";
    
    // playing time in hrs 
      if ($playerstats[$key][PLAYERTIME]> 0) $playerTI=round(($playerstats[$key][PLAYERTIME])/3600, 1);
     else $playerTI=0.0;
    
    // average score/hr 
     if (($playerGS>0) and ($playerTI>0)) $hrscore=round($playerGS/$playerTI, 1); 
     else $hrscore="N/A";
     
     if($playerstats[$key][PLAYERRANK]!="") $playerrank=$playerstats[$key][PLAYERRANK];
     else $playerrank=0;
     
     if($playerstats[$key][PLAYERCOUNTRY]!="-") $playerCO=$playerstats[$key][PLAYERCOUNTRY];
     else $playerCO="unknown";
    
     if($playerstats[$key][PLAYERSTATUS]=="1") $statuspic="player_online.gif";
     else $statuspic="player_offline.gif";
     
     //change the row color
     if ($row=="row2") $row="row1"; else $row="row2";
     
     // print player stats
     echo "<tr class=\"gen\">\n
     		<td align=\"center\" class=$row><img border=\"0\" src=\"images/rank_$playerrank.gif\" width=\"16\" height=\"16\"></td>\n
     		<td class=$row><img border=\"0\" src=\"images/$statuspic\" width=\"42\" height=\"16\"></td>\n
     		<td class=$row><a target=\"_blank\" href=\"$playerurl\">$playername</a></td>\n
     		<td class=$row><img border=\"0\" src=\"images/flags/$playerCO.gif\" width=\"18\" height=\"12\"></td>\n
     		<td align=\"right\" class=$row>$playerGS</td>\n
     		<td align=\"right\" class=$row>$playerMA</td>\n
     		<td align=\"right\" class=$row>$playerWI</td>\n
     		<td align=\"right\" class=$row>$playerLO</td>\n
     		<td align=\"right\" class=$row>$playerTI</td>\n
     		<td align=\"right\" class=$row>$avescore</td>\n
     		<td align=\"right\" class=$row>$hrscore</td>\n
     	  </tr>\n";
    }
     echo "<tr class=\"gensmall\"><td class=\"row1\" colspan=\"12\"  align=\"center\">CO = Country | GS = Global Score | TM = Total Matches | WM = Won Matches | LM = Lost Matches <br> SM = Average Score/Match | SH = Average Score/hr</td></tr>\n
     	   <tr class=\"gensmall\"><td class=\"row2\" colspan=\"12\"  align=\"center\">Click the player name to get more detailed stats @ battletracker.com</td></tr>\n
           </table>\n";
    
    ?>
    Code (markup):
    On my test site this is working fine.
    But when i try to put it on my online site, I'll get this error:
    Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/teamkil/public_html/bf2stats/bf2tracker_clanprofile.php on line 37

    Warning: file_get_contents(http://bf2tracker.com/livefeed/xml_clanprofile.php?clanid=6349) [function.file-get-contents]: failed to open stream: no suitable wrapper could be found in /home/teamkil/public_html/bf2stats/bf2tracker_clanprofile.php on line 37


    Then i change this in to this coding:
    $xmllink="http://bf2tracker.com/livefeed/xml_clanprofile.php?clanid=$clanid";
    $data = xml_parse($xml_parser,file_get_contents($xmllink));
    if(!$data) die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
    
    Code (markup):
    Replaced it with this coding:
    $xmllink="http://bf2tracker.com/livefeed/xml_clanprofile.php?clanid=$clanid";
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $xmllink);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
    $file_contents = curl_exec($ch);
    curl_close($ch);
    $data = xml_parse($xml_parser,$file_contents);
    if(!$data) die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
    Code (markup):
    Then i got this error:
    XML error: SYSTEM or PUBLIC, the URI is missing at line 1

    Anyone great enough too help with my problem?

    Best regards

    ksunmn
     
    ksunmn, Jan 22, 2009 IP