<?php
class PHP45XML {
var $doc;
function PHP45XML() {
# boil down the version information
if (version_compare(PHP_VERSION,'5','>='))
define( 'PHP', 5);
else
define( 'PHP', 4);
}
function loadXML($xml) {
// switch on the version of the PHP interpreter
switch( PHP ) {
case 4:
// create and load the document in the case of php 4 using DOM XML
if (!$this->doc = domxml_open_mem($xml))
die("Error while parsing the XML document\n");
break;
case 5:
// make DOMDocument and load the data
$this->doc = new DOMDocument();
$this->doc->loadXML($xml);
break;
}
}
// This function uses XPath to parse the result XML file of the hostip.info site
function xpath($query) {
$result = array();
// switch on the version of the PHP interpreter
switch( PHP ) {
case 4:
$xpath = $this->doc->xpath_new_context();
// doesn't work, $namespace = $xpath->xpath_eval('namespace-uri(//*)'); // returns the namespace uri
// we need to use the gml namespace.
// TODO: get this out of the document proper and remove magic constant
xpath_register_ns($xpath, "gml", 'http://www.opengis.net/gml' );
$obj = xpath_eval_expression($xpath, "//gml:name"); // finds all gml:name tags
// start of frustrating XML experience
$firstnode = $obj->nodeset[1];
$children = $firstnode->children();
$value = $children[0]->content;
$result['city'] = $value;
$ch = $firstnode->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->children();
$result['country'] = $ch[0]->content;
$ch = $firstnode->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->children();
$result['code'] = $ch[0]->content;
$ch = $firstnode->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->next_sibling();
$ch = $ch->children();
$ch = $ch[1]->children();
$ch = $ch[1]->children();
$ch = $ch[1]->children();
$lnglat = split( ',', $ch[0]->content);
$result['lng'] = $lnglat[0];
$result['lat'] = $lnglat[1];
// end of frustrating XML experience
break;
case 5:
// use XPath to break apart the result into the interesting elements
$xpath = new DOMXPath($this->doc);
$entries = $xpath->query($query); # query = "every gml:name element anywhere in the document"
$i = 1;
foreach ($entries as $entry) {
// first two gml:name entries are bogus
if( $i++ < 2)
continue;
// get the values and save them in the instance
$result['city'] = $entry->nodeValue;
$result['country'] = $entry->nextSibling->nextSibling->nodeValue;
$result['code'] = $entry->nextSibling->nextSibling->nextSibling->nextSibling->nodeValue;
$entries = $xpath->query('//gml:coordinates'); # query = "every gml:name element anywhere in the document"
foreach ($entries as $entry) {
$lnglat = split( ',', $entry->nodeValue);
$result['lng'] = $lnglat[0];
$result['lat'] = $lnglat[1];
break;
}
}
break;
}
return $result;
}
}
?>
|