/** * crafterxml.php * a Dark Age of Camelot Guild XML data parser that returns tradeskill information * for use on Dark Age of Camelot community websites. * * Dark Age of Camelot (or DAoC) is a MMORPG * (massively multiplayer online rolepaying game) * developed by Mythic Entertainment (http://www.mythicentertainment.com) * * Author: Julien COQUET * a.k.a Glenfiddich Singlemalt on DAoC Merlin/Albion * e-mail glenfiddich@purpledragons.net * http://www.purpledragons.net * * Adapted from generic PHP code from http://www.php.net * * Developed in November of 2002 under the GNU GPL License. * For more information, visit http://www.gnu.org/licenses/gpl.html * * Enjoy and please link to our site * http://www.purpledragons.net * * Changelog * March 28, 2003 : added flag to exclude characters with skill level of 1 * March 28, 2003 : added UTF8 support for GOA XML - Euro servers only * Nov. 15th : added support for Herald Character Display page */
class guildXML { /** * This class takes a Dark Age of Camelot Herald XML guild data file and parses it */
var $xml_parser; var $xml_file; var $html; var $open_tag ; var $close_tag ; var $in_char; var $in_alliance; var $chars_array; var $alliance_array; var $current_tag = '';
/** * Class Constructor */
function guildXML() { $this->xml_parser = ""; $this->xml_file = ""; $this->html = ""; } // Class Destructor (has to be invoked manually as PHP does not support destructors) function destroy() { xml_parser_free($this->xml_parser); } // Class Members function concat($str) { $this->html .= $str; }
function startElement($parser, $name, $attrs) { global $totalchars, $num_activechars, $num_inactivechars, $insideElement, $in_char, $current_tag, $i;
if (($in_char == 1) || ($in_alliance == 1)) { $current_tag = trim($name); } if ($name == 'GUILD') { $current_tag = $name; if (sizeof($attrs)) { while (list($k, $v) = each($attrs)) { if ($k == 'GUILDRP') { $this->guildrp = trim($v); } ; if ($k == 'TIMESTAMP') { $this->timestamp = trim ($v); } ; } } }
if ($name == 'CHARACTER') { $in_alliance = 1; } if ($name == 'CHARACTER') { $in_char = 1; $totalchars++; if (sizeof($attrs)) { while (list($k, $v) = each($attrs)) { if ($k == 'NAME') { $this->chars_array[$i]['name'] = trim($v); $this->chars_array[$i]['firstname'] = trim (substr($this->chars_array[$i]['name'], 0, strpos($this->chars_array[$i]['name'], ' '))); $this->chars_array[$i]['lastname'] = trim (substr($this->chars_array[$i]['name'], strpos($this->chars_array[$i]['name'], ' '))); if (!$this->chars_array[$i]['firstname'] && $this->chars_array[$i]['lastname']) { $this->chars_array[$i]['firstname'] = $this->chars_array[$i]['lastname']; $this->chars_array[$i]['lastname'] = ''; } } ; if ($k == 'ID') { $this->chars_array[$i]['id'] = $v; } ; if ($k == 'LASTON') { $this->chars_array[$i]['laston'] = trim($v); if ($v != 'Inactive') { $num_activechars++; } elseif ($v == 'Inactive') { $num_inactivechars++; } } } } } }
function endElement($parser, $name) { global $close_tag, $current_tag, $in_char, $i;
function parse() { $this->xml_parser = xml_parser_create(); xml_set_object($this->xml_parser, &$this); // use case-folding so we are sure to find the tag in $map_array xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($this->xml_parser, "startElement", "endElement"); xml_set_character_data_handler($this->xml_parser, "characterData"); // xml_set_processing_instruction_handler($this->xml_parser, "PIHandler"); if (!($fp = fopen($this->xml_file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($this->xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser))); } } } } // End of class // Support functions /** * The function sortItems() is used for sorting, called upon by uksort() * It uses querystring parameter $param as the sorting parameter * querystring parameter $dir indicates ascending or descending order */
function sortItems($a, $b) { global $gu, $dir, $param;