| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 | <?php/** * @file * OWL redesign using Classes (Objects) */class OWLStanza {  // The XMLReader object.  private $owl = NULL;  // A boolean (TRUE or FALSE) indicating if children should be parsed.  private $parse_children = TRUE;  // The XML element tag name (e.g. ‘owl:ObjectProperty’,  // ‘owl:AnnotationProperty’, 'owl:Ontology').  private $tag_name = '';  // A key/value associative array of all of the attributes.  private $attributes = array ();  // An array of OWLStanza objects.  private $children = array ();  // The text value of a XML element.  private $value;  // Indicates if there is no more to read from the OWL XML file.  private $is_finished = FALSE;  /**   * Implements the constructor.   *   * @param $parse_children   * A boolean (TRUE or FALSE) indicating if children should be parsed.   * If FALSE only attributes will be parse.   */  public function __construct($owl, $parse_children = TRUE) {    $this->owl = $owl;    $this->parse_children = $parse_children;    $this->parse();  }  /**   * A wrapper for XMLReader::read() read function.   *   * This function calls read() on the $owl object and checks to see   * if we are at the end of the XML file. If so, it sets the $is_finished   * member variable to TRUE.   *   * @return   *   The value of XMLReader::read().   */  private function owl_read() {    $retval = $this->owl->read();    if ($this->owl->nodeType == XMLReader::END_ELEMENT and $this->owl->name == 'rdf:RDF') {      $this->is_finished = TRUE;    }    return $retval;  }  /**   *   * @param private   * This function is to parse each of the OWL Stanzas of the ro.owl file.   */    private function parse() {      // Make sure we are at the beginning of an element.      while ($this->owl->nodeType != XMLReader::ELEMENT) {        // In the event we've hit the end of the file, then return.        if ($this->is_finished) {          return;        }        $this->owl_read();       }      $this->tag_name = $this->owl->name;      $has_value = $this->owl->hasValue;      $is_empty = $this->owl->isEmptyElement;      // Get the attributes.      $num_attrs = $this->owl->attributeCount;      if ($num_attrs > 0) {        $this->owl->moveToFirstAttribute();        for ($i = 0; $i < $num_attrs; $i++) {          $this->attributes[$this->owl->name] = $this->owl->value;          $this->owl->moveToNextAttribute();        }      }      // If this element is empty then just return.      if ($is_empty) {        return;      }      // Determine if the element has a value. If so, then set the value for the class.      if ($this->owl->hasValue) {        $this->owl_read();        $this->value = $this->owl->value;      }      // Get the children that should be parsed within the Stanza.      if ($this->parse_children == TRUE) {        while ($this->owl_read()) {          if ($this->owl->nodeType == XMLReader::END_ELEMENT and $this->owl->name == $this->tag_name) {            return;          }          else if ($this->owl->nodeType == XMLReader::ELEMENT) {            $child = new OWLStanza($this->owl);            $this->children[] = $child;          }        }      }    }   /**    * Get the Value    *    * @ return The text value of a XML element.    */    public function getValue() {      return $this->value;    }  /**   * Gets the children array.   *   * @return An array of OWLStanza objects containing the children elements.   */  public function getChildren() {    return $this->children;  }  /**   * Sets the children array.   *   * @param $children   * An array of OWLStanza objects containing the children elements.   * @return FALSE if the array was not set, TRUE otherwise.   */  public function setChildren($children) {    // Makes sure the incoming argument is an array.    if (! is_array ( $children )) {      return FALSE;    }    // Make sure that all of the array elements are OWLStanza objects.    foreach ( $children as $child ) {      if (get_class ( $child ) != 'OWLStanza') {        return FALSE;      }    }    // All is good, set the children.    $this->children = $children;  }  /**   * Gets the child($tag_name) array.   *   * @return   *  An OWLStanza object whos tag name matches the tag name provided.   *   *   */  public function getChild($tag_name) {    foreach ($this->children as $child) {      if ($child->getTagName() == $tag_name) {        return $child;      }    }    return NULL;  }  /**   * Gets the tag name.   *   * @return An XML element tag name (e.g. ‘owl:ObjectProperty’,   *         'owl:AnnotationProperty’, 'owl:Ontology').   */  public function getTagName() {    return $this->tag_name;  }  /**   * Sets the tag name.   *   * @param $tag_name The   *          XML element tag name   * @return value element tag name.   */  public function setTagName($tag_name) {    $this->tag_name = $tag_name;    return;  }  /**   * Gets the attributes array.   *   * @return An array containing a key/value associative array   *         of all of the attributes between the XML elements tag name.   */  public function getAttributes() {    return $this->attributes;  }  /**   * Sets the attributes array.   *   * @param $attributes An   *          array containing a key/value associative array of all of the attributes.   * @return FALSE if the array was not set, TRUE otherwise.   */  public function setAttributes($attributes) {    // Makes sure the incoming argument is an array.    if (! is_array ( $attributes )) {      return FALSE;    }    // Make sure that all of the array are key/values.    foreach ( $attributes as $attribute_name ) {      if (get_class ($attribute_name ) != 'OWLStanza') {        return FALSE;      }    }    // All is good, set the attributes.    $this->attributes = $attributes;  }  /**   *   * @param   *          $attribute_name   * @return An|NULL   */  public function getAttribute($attribute_name) {    foreach ($this->attributes as $aname => $value ) {      if ($aname == $attribute_name) {        return $value;      }    }    return NULL;  }  /**   * Checks if the OWL XML file has been completely parsed.   *   * @return   *   TRUE if parsing is completed, FALSE otherwise.   */  public function isFinished() {    return $this->is_finished;  }  /**   * Reconstructs the XML for the stanza.   *   * @return   *   A string containing XML for this stanza.   */  public function getXML() {    // Start the element with the tag name.    $xml = '<' . $this->tag_name;    // Iterate through the attributes and add them to our XML string.    if (count($this->attributes) > 0) {      foreach ($this->attributes as $aname => $value) {        $xml .=  " " . $aname . '="' . $value . '"';      }    }    // If this stanza has a value this implies there are no children,    // so close the element start, add the value and add the closing element    // tag.    if ($this->value) {      $xml .= '>' . $this->value . '</' . $this->tag_name . ">\n";      return $xml;    }    // If we're here, we do not have a value. This is therefore an empty    // element, or it has children.  If we have no children then we    // have an empty element and we can close it out and return.    if (count($this->children) == 0) {      $xml .= " />\n";      return $xml;    }    // Add in the children's XML recursively.    $childs = '';    foreach ($this->children as $child) {      // We want to add two character indentation to all lines returned by      // the child XML.      $childs .= preg_replace("/^/","  ", $child->getXML());    }    $xml .= ">\n";    $xml .= $childs;    $xml .= "</" . $this->tag_name . ">\n";    return $xml;  }}
 |