Example PHP to Parse XML
The PHP code below is an example script for parsing the XML request sent for generating registration keys.
<?php
class BMTXMLParser {
var $tag_name;
var $tag_data;
var $tag_prev_name;
var $tag_parent_name;
function BMTXMLParser () {
$tag_name = NULL;
$tag_data = array ();
$tag_prev_name = NULL;
$tag_parent_name = NULL;
}
function startElement ($parser, $name, $attrs) {
if ($this->tag_name != NULL) {
$this->tag_parent_name = $this->tag_name;
}
$this->tag_name = $name;
}
function endElement ($parser, $name) {
if ($this->tag_name == NULL) {
$this->tag_parent_name = NULL;
}
$this->tag_name = NULL;
$this->tag_prev_name = NULL;
}
function characterData ($parser, $data) {
if ($this->tag_name == $this->tag_prev_name) {
$data = $this->tag_data[$this->tag_name] . $data;
}
$this->tag_data[$this->tag_name] = $data;
if ($this->tag_parent_name != NULL) {
$this->tag_data[$this->tag_parent_name . "." . $this->tag_name] = $data;
}
$this->tag_prev_name = $this->tag_name;
}
function parse ($data) {
if (!function_exists ('xml_parser_create')) {
$this->tag_data['error'] = 'php-xml is not installed on the server';
return (false);
}
$xml_parser = xml_parser_create ();
xml_set_object ($xml_parser, $this);
xml_parser_set_option ($xml_parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler ($xml_parser, "startElement", "endElement");
xml_set_character_data_handler ($xml_parser, "characterData");
$success = xml_parse ($xml_parser, $data, true);
if (!$success) {
$this->tag_data['error'] = 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);
return ($success);
}
function getElement ($tag) {
return ($this->tag_data[$tag]);
}
}
header ("Content-type: text/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="utf-8"?>';
echo '<response>';
echo '<registrationkey>';
$bmtparser = new BMTXMLParser ();
$postdata = file_get_contents ("php://input");
if ($bmtparser->parse ($postdata)) {
# keycount is normally 1. However, if the product option "Use one
# key" in the vendor area has been unchecked, BMT Micro expects
# you to send back as many keys as the number of items (quantity)
# ordered. The variable keycount represents the number of keys
# that the system expects to receive back from you.
$keycount = $bmtparser->getElement ('keycount');
for ($key = 1; $key <= $keycount; $key++) {
$keydata = 'The registration key for ' . $bmtparser->getElement ('registername') . ' is ' . $key;
echo '<keydata>' . $keydata . '</keydata>';
}
}
else {
echo '<errorcode>1</errorcode>';
echo '<errormessage>' . $bmtparser->getElement ('error') . '</errormessage>';
}
echo '</registrationkey>';
echo '</response>';
?>