Back to index

awl  0.53
Public Member Functions | Static Public Attributes | Private Attributes
XMLDocument Class Reference

List of all members.

Public Member Functions

 __construct ($namespaces=null)
 Simple XMLDocument constructor.
 AddNamespace ($namespace, $prefix=null)
 Add a new namespace to the document, optionally specifying it's short prefix.
 DefaultNamespace ()
 Return the default namespace for this document.
 GetXmlNsArray ()
 Return a tag with namespace stripped and replaced with a short form, and the ns added to the document.
 Tag ($in_tag, $namespace=null, $prefix=null)
 Return a tag with namespace stripped and replaced with a short form, and the ns added to the document.
 NSElement (&$element, $in_tag, $content=false, $attributes=false, $namespace=null)
 Special helper for namespaced tags.
 DAVElement (&$element, $tag, $content=false, $attributes=false)
 Special helper for tags in the DAV: namespace.
 CalDAVElement (&$element, $tag, $content=false, $attributes=false)
 Special helper for tags in the urn:ietf:params:xml:ns:caldav namespace.
 CardDAVElement (&$element, $tag, $content=false, $attributes=false)
 Special helper for tags in the urn:ietf:params:xml:ns:carddav namespace.
 CalendarserverElement (&$element, $tag, $content=false, $attributes=false)
 Special helper for tags in the urn:ietf:params:xml:ns:caldav namespace.
 NewXMLElement ($in_tag, $content=false, $attributes=false, $xmlns=null)
 Render ($root, $content=false, $attributes=false, $xmlns=null)
 Render the document tree into (nicely formatted) XML.
 href ($url)
 Return a DAV::href XML element, or an array of them.

Static Public Attributes

static $ns_dav = 'DAV:'
static $ns_caldav = 'urn:ietf:params:xml:ns:caldav'
static $ns_carddav = 'urn:ietf:params:xml:ns:carddav'
static $ns_calendarserver = 'http://calendarserver.org/ns/'

Private Attributes

 $namespaces
 $prefixes
 $root

Detailed Description

Definition at line 20 of file XMLDocument.php.


Constructor & Destructor Documentation

XMLDocument::__construct ( namespaces = null)

Simple XMLDocument constructor.

Parameters:
array$namespacesAn array of 'namespace' => 'prefix' pairs, where the prefix is used as a short form for the namespace.

Definition at line 48 of file XMLDocument.php.

                                             {
    $this->namespaces = array();
    $this->prefixes = array();
    if ( $namespaces != null ) {
      foreach( $namespaces AS $ns => $prefix ) {
        $this->namespaces[$ns] = $prefix;
        $this->prefixes[$prefix] = $prefix;
      }
    }
    $this->next_prefix = 0;
  }

Member Function Documentation

XMLDocument::AddNamespace ( namespace,
prefix = null 
)

Add a new namespace to the document, optionally specifying it's short prefix.

Parameters:
string$namespaceThe full namespace name to be added
string$prefixAn optional short form for the namespace.

Definition at line 66 of file XMLDocument.php.

                                                      {
    if ( !isset($this->namespaces[$namespace]) ) {
      if ( isset($prefix) && ($prefix == "" || isset($this->prefixes[$prefix])) ) $prefix = null;
      if ( $prefix == null ) {
        //  Try and build a prefix based on the first alphabetic character of the last element of the namespace
        if ( preg_match('/^(.*):([^:]+)$/', $namespace, $matches) ) {
          $alpha = preg_replace( '/[^a-z]/i', '', $matches[2] );
          $prefix = strtoupper(substr($alpha,0,1));
        }
        else {
          $prefix = 'X';
        }
        $i = "";
        if ( isset($this->prefixes[$prefix]) ) {
          for ( $i=1; $i<10 && isset($this->prefixes["$prefix$i"]); $i++ ) {
          }
        }
        if ( isset($this->prefixes["$prefix$i"]) ) {
          dbg_error_log("ERROR", "Cannot find a free prefix for this namespace");
          exit;
        }
        $prefix = "$prefix$i";
        dbg_error_log("XMLDocument", "auto-assigning prefix of '%s' for ns of '%s'", $prefix, $namespace );
      }
      else if ( $prefix == "" || isset($this->prefixes[$prefix]) ) {
        dbg_error_log("ERROR", "Cannot assign the same prefix to two different namespaces");
        exit;
      }

      $this->prefixes[$prefix] = $prefix;
      $this->namespaces[$namespace] = $prefix;
    }
    else {
      if ( isset($this->namespaces[$namespace]) && $this->namespaces[$namespace] != $prefix ) {
        dbg_error_log("ERROR", "Cannot use the same namespace with two different prefixes");
        exit;
      }
      $this->prefixes[$prefix] = $prefix;
      $this->namespaces[$namespace] = $prefix;
    }
  }

Here is the caller graph for this function:

XMLDocument::CalDAVElement ( &$  element,
tag,
content = false,
attributes = false 
)

Special helper for tags in the urn:ietf:params:xml:ns:caldav namespace.

Parameters:
object$elementThe tag are adding a new namespaced element to
string$tagthe tag name
mixed$contentThe content of the tag
array$attributesAn array of key/value pairs of attributes.

Definition at line 225 of file XMLDocument.php.

                                                                               {
    if ( !isset($this->namespaces[self::$ns_caldav]) ) $this->AddNamespace( self::$ns_caldav, 'C' );
    return $this->NSElement( $element, $tag, $content, $attributes, self::$ns_caldav );
  }

Here is the call graph for this function:

XMLDocument::CalendarserverElement ( &$  element,
tag,
content = false,
attributes = false 
)

Special helper for tags in the urn:ietf:params:xml:ns:caldav namespace.

Parameters:
object$elementThe tag are adding a new namespaced element to
string$tagthe tag name
mixed$contentThe content of the tag
array$attributesAn array of key/value pairs of attributes.

Definition at line 253 of file XMLDocument.php.

                                                                                       {
    if ( !isset($this->namespaces[self::$ns_calendarserver]) ) $this->AddNamespace( self::$ns_calendarserver, 'A' );
    return $this->NSElement( $element, $tag, $content, $attributes, self::$ns_calendarserver );
  }

Here is the call graph for this function:

XMLDocument::CardDAVElement ( &$  element,
tag,
content = false,
attributes = false 
)

Special helper for tags in the urn:ietf:params:xml:ns:carddav namespace.

Parameters:
object$elementThe tag are adding a new namespaced element to
string$tagthe tag name
mixed$contentThe content of the tag
array$attributesAn array of key/value pairs of attributes.

Definition at line 239 of file XMLDocument.php.

                                                                                {
    if ( !isset($this->namespaces[self::$ns_carddav]) ) $this->AddNamespace( self::$ns_carddav, 'VC' );
    return $this->NSElement( $element, $tag, $content, $attributes, self::$ns_carddav );
  }

Here is the call graph for this function:

XMLDocument::DAVElement ( &$  element,
tag,
content = false,
attributes = false 
)

Special helper for tags in the DAV: namespace.

Parameters:
object$elementThe tag are adding a new namespaced element to
string$tagthe tag name
mixed$contentThe content of the tag
array$attributesAn array of key/value pairs of attributes.

Definition at line 212 of file XMLDocument.php.

                                                                            {
    if ( !isset($this->namespaces[self::$ns_dav]) ) $this->AddNamespace( self::$ns_dav, '' );
    return $this->NSElement( $element, $tag, $content, $attributes, self::$ns_dav );
  }

Here is the call graph for this function:

Return the default namespace for this document.

Definition at line 111 of file XMLDocument.php.

                              {
    foreach( $this->namespaces AS $k => $v ) {
      if ( $v == '' ) {
        return $k;
      }
    }
    return '';
  }

Return a tag with namespace stripped and replaced with a short form, and the ns added to the document.

Definition at line 124 of file XMLDocument.php.

                           {

    $ns = array();
    foreach( $this->namespaces AS $n => $p ) {
      if ( $p == "" ) $ns["xmlns"] = $n; else $ns["xmlns:$p"] = $n;
    }

    return $ns;
  }
XMLDocument::href ( url)

Return a DAV::href XML element, or an array of them.

Parameters:
mixed$urlThe URL (or array of URLs) to be wrapped in DAV::href tags
Returns:
XMLElement The newly created XMLElement object.

Definition at line 315 of file XMLDocument.php.

                      {
    if ( is_array($url) ) {
      $set = array();
      foreach( $url AS $href ) {
        $set[] = $this->href( $href );
      }
      return $set;
    }
    if ( preg_match('[@+ ]',$url) ) {
      trace_bug('URL "%s" was not encoded before call to XMLDocument::href()', $url );
      $url = str_replace( '%2F', '/', rawurlencode($url));
    }
    return $this->NewXMLElement('href', $url, false, 'DAV:');
  }

Here is the call graph for this function:

XMLDocument::NewXMLElement ( in_tag,
content = false,
attributes = false,
xmlns = null 
)
Parameters:
string$in_tagThe tag name of the new element, possibly namespaced
mixed$contentEither a string of content, or an array of sub-elements
array$attributesAn array of attribute name/value pairs
array$xmlnsAn XML namespace specifier

Definition at line 265 of file XMLDocument.php.

                                                                                    {
    if ( $xmlns == null && preg_match('/^(.*):([^:]+)$/', $in_tag, $matches) ) {
      $xmlns = $matches[1];
      $tagname = $matches[2];
    }
    else {
      $tagname = $in_tag;
    }

    if ( isset($xmlns) && !isset($this->namespaces[$xmlns]) ) $this->AddNamespace( $xmlns );
    return new XMLElement($tagname, $content, $attributes, $xmlns );
  }

Here is the call graph for this function:

Here is the caller graph for this function:

XMLDocument::NSElement ( &$  element,
in_tag,
content = false,
attributes = false,
namespace = null 
)

Special helper for namespaced tags.

Parameters:
object$elementThe tag are adding a new namespaced element to
string$tagthe tag name, possibly prefixed with the namespace
mixed$contentThe content of the tag
array$attributesAn array of key/value pairs of attributes.
string$namespaceThe namespace for the tag

Definition at line 184 of file XMLDocument.php.

                                                                                               {
    if ( $namespace == null && preg_match('/^(.*):([^:]+)$/', $in_tag, $matches) ) {
      $namespace = $matches[1];
      if ( preg_match('{^[A-Z][A-Z0-9]*$}', $namespace ) ) {
        throw new Exception("Dodgy looking namespace from '".$in_tag."'!");
      }
      $tag = $matches[2];
    }
    else {
      $tag = $in_tag;
      if ( isset($namespace) ) {
        $tag = str_replace($namespace.':', '', $tag);
      }
    }

    if ( isset($namespace) && !isset($this->namespaces[$namespace]) ) $this->AddNamespace( $namespace );
    return $element->NewElement( $tag, $content, $attributes, $namespace );
  }

Here is the call graph for this function:

Here is the caller graph for this function:

XMLDocument::Render ( root,
content = false,
attributes = false,
xmlns = null 
)

Render the document tree into (nicely formatted) XML.

Parameters:
mixed$rootA root XMLElement or a tagname to create one with the remaining parameters.
mixed$contentEither a string of content, or an array of sub-elements
array$attributesAn array of attribute name/value pairs
array$xmlnsAn XML namespace specifier
Returns:
A rendered namespaced XML document.

They handed us a pre-existing object. We'll just use it...

We got a tag name, so we need to create the root element

Add our namespace attributes here.

And render...

Definition at line 288 of file XMLDocument.php.

                                                                           {
    if ( is_object($root) ) {
      $this->root = $root;
    }
    else {
      $this->root = $this->NewXMLElement( $root, $content, $attributes, $xmlns );
    }

    foreach( $this->namespaces AS $n => $p ) {
      $this->root->SetAttribute( 'xmlns'.($p == '' ? '' : ':') . $p, $n);
    }

    return $this->root->Render(0,'<?xml version="1.0" encoding="utf-8" ?>');
  }

Here is the call graph for this function:

XMLDocument::Tag ( in_tag,
namespace = null,
prefix = null 
)

Return a tag with namespace stripped and replaced with a short form, and the ns added to the document.

Parameters:
string$in_tagThe tag we want a namespace prefix on.
string$namespaceThe namespace we want it in (which will be parsed from $in_tag if not present
string$prefixThe prefix we would like to use. Leave it out and one will be assigned.
Returns:
string The tag with a namespace prefix consistent with previous tags in this namespace.

Definition at line 144 of file XMLDocument.php.

                                                         {

    if ( $namespace == null ) {
      // Attempt to split out from namespace:tag
      if ( preg_match('/^(.*):([^:]+)$/', $in_tag, $matches) ) {
        $namespace = $matches[1];
        $tag = $matches[2];
      }
      else {
        // There is nothing we can do here
        return $in_tag;
      }
    }
    else {
      $tag = $in_tag;
    }

    if ( !isset($this->namespaces[$namespace]) ) {
      $this->AddNamespace( $namespace, $prefix );
    }
    $prefix = $this->namespaces[$namespace];

    return $prefix . ($prefix == "" ? "" : ":") . $tag;
  }

Here is the call graph for this function:


Member Data Documentation

Definition at line 29 of file XMLDocument.php.

XMLDocument::$ns_caldav = 'urn:ietf:params:xml:ns:caldav' [static]

Definition at line 170 of file XMLDocument.php.

XMLDocument::$ns_calendarserver = 'http://calendarserver.org/ns/' [static]

Definition at line 172 of file XMLDocument.php.

XMLDocument::$ns_carddav = 'urn:ietf:params:xml:ns:carddav' [static]

Definition at line 171 of file XMLDocument.php.

XMLDocument::$ns_dav = 'DAV:' [static]

Definition at line 169 of file XMLDocument.php.

Definition at line 35 of file XMLDocument.php.

XMLDocument::$root [private]

Definition at line 41 of file XMLDocument.php.


The documentation for this class was generated from the following file: