*
* @package sparql
*/
class SparqlResultParser extends Object {
var $arrOutput = array();
var $resParser;
var $strXmlData;
var $counter = -1;
var $mode = -1;
var $varname;
var $dtype;
var $lang;
var $varlist;
var $bncounter = 0;
var $current_literal;
/**
* Main function of SparqlResultParser
*
* @param String $strInputXML input document.
*/
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) {
echo "unable to parse result
".
"server returned:
"
.$strInputXML;
return "false";
}
xml_parser_free($this->resParser);
return $this->arrOutput;
}
// private parser functions from here //
function tagOpen($parser, $name, $attrs) {
// $tag=array("name"=>$name,"attrs"=>$attrs);
// array_push($this->arrOutput,$tag);
if(strtolower($name)=="variable"){
if(isset($attrs['name']))
$this->varlist[]=$attrs['name'];
if(isset($attrs['NAME']))
$this->varlist[]=$attrs['NAME'];
}
if(strtolower($name)=="result"){
$this->counter++;
if($this->counter > -1){
foreach($this->varlist as $value){
if(!isset($this->arrOutput[$this->counter][$value]))
$this->arrOutput[$this->counter]["?".$value]='';
}
}
}
if(strtolower($name)=="boolean"){
$this->counter++;
$this->mode = 3;
}
if(strtolower($name)=="binding"){
$this->varname = null;
$this->dtype = null;
$this->lang = null;
if(isset($attrs['name'])){
$this->varname = "?".$attrs['name'];
}else{
$this->varname = "?".$attrs['NAME'];
}
}
if(strtolower($name)=="uri"){
$this->mode = 0;
}
if(strtolower($name)=="literal"){
$this->mode = 1;
$this->current_literal = "";
if(isset($attrs['datatype'])){
$this->dtype = $attrs['datatype'];
}else if(isset($attrs['DATATYPE'])){
$this->dtype = $attrs['DATATYPE'];
}
if(isset($attrs['xml:lang'])){
$this->lang = $attrs['datatype'];
}else if(isset($attrs['XML:lang'])){
$this->lang = $attrs['XML:lang'];
}else if(isset($attrs['XML:LANG'])){
$this->lang = $attrs['XML:LANG'];
}else if(isset($attrs['xml:LANG'])){
$this->lang = $attrs['xml:LANG'];
}
}
if(strtolower($name)=="bnode"){
$this->mode = 2;
}
}
function tagData($parser, $tagData) {
switch($this->mode){
case 0 :
$this->arrOutput[$this->counter][$this->varname] = new Resource($tagData);
$this->mode = -1;
break;
case 1:
$this->current_literal .= $tagData;
break;
case 2:
if($tagData=="/"){
$bn = "bNode".$this->bncounter;
$this->bncounter++;
}else{
$bn = $tagData;
}
$this->arrOutput[$this->counter][$this->varname] = new BlankNode($bn);
$this->mode = -1;
break;
case 3:
$this->arrOutput = $tagData;
$this->mode = -1;
break;
}
}
function tagClosed($parser, $name) {
if ($this->mode == 1) {
$lit = new Literal($this->current_literal);
if($this->lang)
$lit->setLanguage($this->lang);
if($this->dtype)
$lit->setDatatype($this->dtype);
$this->arrOutput[$this->counter][$this->varname] = $lit ;
$this->mode = -1;
}
}
}
?>