Ejemplo n.º 1
0
 protected static function __parseXmlToObject($node, &$object)
 {
     while ($node) {
         //print "Node: {$node->nodeType} -- {$node->nodeName}\n";
         if ($node->nodeType == XML_TEXT_NODE) {
             if ($node->wholeText != null) {
                 $text = trim($node->wholeText);
                 if (!empty($text)) {
                     $object->description = $text;
                 }
             }
         } else {
             if ($node->nodeType == XML_ELEMENT_NODE) {
                 $nodeName = str_replace("-", "_", $node->nodeName);
                 if ($object instanceof Recurly_Pager) {
                     $new_obj = Recurly_Resource::__createNodeObject($node);
                     if (!is_null($new_obj)) {
                         Recurly_Resource::__parseXmlToObject($node->firstChild, $new_obj);
                         $object->_objects[] = $new_obj;
                     }
                     $node = $node->nextSibling;
                     continue;
                 } else {
                     if ($object instanceof Recurly_ErrorList) {
                         if ($nodeName == 'error') {
                             $object[] = Recurly_Resource::parseErrorNode($node);
                             $node = $node->nextSibling;
                             continue;
                         }
                     } else {
                         if (is_array($object)) {
                             if ($nodeName == 'error') {
                                 $object[] = Recurly_Resource::parseErrorNode($node);
                                 $node = $node->nextSibling;
                                 continue;
                             }
                             $new_obj = Recurly_Resource::__createNodeObject($node);
                             if (!is_null($new_obj)) {
                                 if (is_object($new_obj) || is_array($new_obj)) {
                                     Recurly_Resource::__parseXmlToObject($node->firstChild, $new_obj);
                                 }
                                 $object[] = $new_obj;
                             }
                             $node = $node->nextSibling;
                             continue;
                         }
                     }
                 }
                 $numChildren = $node->childNodes->length;
                 if ($numChildren == 0) {
                     // No children, we might have a link
                     $href = $node->getAttribute('href');
                     if (!empty($href)) {
                         if ($nodeName == 'a') {
                             $linkName = $node->getAttribute('name');
                             $method = $node->getAttribute('method');
                             $object->addLink($linkName, $href, $method);
                         } else {
                             if (!is_object($object)) {
                                 $object->{$nodeName} = new Recurly_Stub($nodeName, $href);
                             } else {
                                 $object->{$nodeName} = new Recurly_Stub($nodeName, $href, $object->_client);
                             }
                         }
                     }
                 } else {
                     if ($node->firstChild->nodeType == XML_ELEMENT_NODE) {
                         // has element children, drop in and continue parsing
                         $new_obj = Recurly_Resource::__createNodeObject($node);
                         if (!is_null($new_obj)) {
                             $object->{$nodeName} = Recurly_Resource::__parseXmlToObject($node->firstChild, $new_obj);
                         }
                     } else {
                         // we have a single text child
                         if ($node->hasAttribute('nil')) {
                             $object->{$nodeName} = null;
                         } else {
                             switch ($node->getAttribute('type')) {
                                 case 'boolean':
                                     $object->{$nodeName} = $node->nodeValue == 'true';
                                     break;
                                 case 'date':
                                 case 'datetime':
                                     $object->{$nodeName} = new DateTime($node->nodeValue);
                                     break;
                                 case 'float':
                                     $object->{$nodeName} = (double) $node->nodeValue;
                                     break;
                                 case 'integer':
                                     $object->{$nodeName} = (int) $node->nodeValue;
                                     break;
                                 case 'array':
                                     $object->{$nodeName} = array();
                                     break;
                                 default:
                                     $object->{$nodeName} = $node->nodeValue;
                             }
                         }
                     }
                 }
             }
         }
         $node = $node->nextSibling;
     }
     if (isset($object->_unsavedKeys)) {
         $object->_unsavedKeys = array();
     }
     return $object;
 }