private function xmlToArray(\SimpleXMLIterator $sxi) { $a = array(); for ($sxi->rewind(); $sxi->valid(); $sxi->next()) { $t = array(); $current = $sxi->current(); $attributes = $current->attributes(); $name = isset($attributes->_key) ? strval($attributes->_key) : $sxi->key(); // save attributes foreach ($attributes as $att_key => $att_value) { if ($att_key !== '_key') { $t[$att_key] = strval($att_value); } } // we parse nodes if ($sxi->hasChildren()) { // children $t = array_merge($t, $this->xmlToArray($current)); } else { // it's a leaf if (empty($t)) { $t = strval($current); // strval will call _toString() } else { $t['_value'] = strval($current); // strval will call _toString() } } $a[$name] = $t; } return $a; }
/** * Converts a SimpleXMLIterator structure into an associative array. * * Used to parse an XML response from Mollom servers into a PHP array. For * example: * @code * $elements = new SimpleXmlIterator($response_body); * $parsed_response = $this->parseXML($elements); * @endcode * * @param SimpleXMLIterator $sxi * A SimpleXMLIterator structure of the server response body. * * @return array * An associative, possibly multidimensional array. */ public static function parseXML(SimpleXMLIterator $sxi) { $a = array(); $remove = array(); for ($sxi->rewind(); $sxi->valid(); $sxi->next()) { $key = $sxi->key(); // Recurse into non-scalar values. if ($sxi->hasChildren()) { $value = self::parseXML($sxi->current()); } else { $value = strval($sxi->current()); } if (!isset($a[$key])) { $a[$key] = $value; } else { // First time we reach here, convert the existing keyed item. Do not // remove $key, so we enter this path again. if (!isset($remove[$key])) { $a[] = $a[$key]; // Mark $key for removal. $remove[$key] = $key; } // Add the new item. $a[] = $value; } } // Lastly, remove named keys that have been converted to indexed keys. foreach ($remove as $key) { unset($a[$key]); } return $a; }
} if (!$quiet) { printf("Done." . PHP_EOL . "Getting cash import file list ... "); } $files = get_files(); if (!$files) { unlink(COOKIE_FILE); die("Cannot get file list!" . PHP_EOL); } if (!$quiet) { printf("Done." . PHP_EOL); } $xml = new SimpleXMLIterator($files); $xml->rewind(); while ($xml->valid()) { if ($xml->key() == "rows") { $rows = $xml->getChildren(); $rows->rewind(); while ($rows->valid()) { if ($rows->key() == "row") { $fileid = $filename = NULL; $props = $rows->getChildren(); $props->rewind(); while ($props->valid()) { switch ($props->key()) { case "id": $fileid = strval($props->current()); break; case "file_name": $filename = strval($props->current()); }
/** * Parses object. Turns raw XML(NPRML) into various object properties. */ function parse() { if (!empty($this->xml)) { $xml = $this->xml; } else { $this->notices[] = 'No XML to parse.'; return; } $object = simplexml_load_string($xml); $this->add_simplexml_attributes($object, $this); if (!empty($object->message)) { $this->message->id = $this->get_attribute($object->message, 'id'); $this->message->level = $this->get_attribute($object->message, 'level'); } if (!empty($object->list->story)) { foreach ($object->list->story as $story) { $parsed = new NPRMLEntity(); $this->add_simplexml_attributes($story, $parsed); //Iterate trough the XML document and list all the children $xml_iterator = new SimpleXMLIterator($story->asXML()); $key = NULL; $current = NULL; for ($xml_iterator->rewind(); $xml_iterator->valid(); $xml_iterator->next()) { $current = $xml_iterator->current(); $key = $xml_iterator->key(); if ($key == 'image' || $key == 'audio' || $key == 'link') { // images if ($key == 'image') { $parsed->{$key}[] = $this->parse_simplexml_element($current); } // audio if ($key == 'audio') { $parsed->{$key}[] = $this->parse_simplexml_element($current); } // links if ($key == 'link') { $type = $this->get_attribute($current, 'type'); $parsed->{$key}[$type] = $this->parse_simplexml_element($current); } } else { //if ->$key exist, see if it's an array. if it is, add the next child. if (!empty($parsed->{$key})) { //if it's not an array, make an array, add the existing element to it if (!is_array($parsed->{$key})) { $parsed->{$key} = array($parsed->{$key}); } // then add the new child. $parsed->{$key}[] = $this->parse_simplexml_element($current); } else { //The key wasn't parsed already, so just add the current element. $parsed->{$key} = $this->parse_simplexml_element($current); } } } $body = ''; if (!empty($parsed->textWithHtml->paragraphs)) { foreach ($parsed->textWithHtml->paragraphs as $paragraph) { $body = $body . $paragraph->value . "\n\n"; } } $parsed->body = $body; $this->stories[] = $parsed; } //if the query didn't have a sort parameter, reverse the order so that we end up with //stories in reverse-chron order. //there are no params and 'sort=' is not in the URL if (empty($this->request->params) && !stristr($this->request->request_url, 'sort=')) { $this->stories = array_reverse($this->stories); } //there are params, and sort is not one of them if (!empty($this->request->params) && !array_key_exists('sort', $this->request->params)) { $this->stories = array_reverse($this->stories); } } }
function key() { echo __METHOD__ . "\n"; return parent::key(); }
flushExit(); exit; } else { // Log open XML-setup filename $strDescription = '- open XML-setup filename "' . $filenameXmlSetup . '"' . PHP_EOL; $strLine = ''; logLog(0, $strDescription, $strLine, 2); } // parse through XML-setup and store values in for ($xmlSetupIterator->rewind(); $xmlSetupIterator->valid(); $xmlSetupIterator->next()) { // $arrXmlSection[<[section]>] = <0..n> | Section order from top to bottom // $arrXmlSectionKey[<[section]>][<key>] = <0..n> | Key order from top to bottom // $arrXmlParameter[<key>] = <value> // $nXmlSection // $nXmlSectionKey switch ($xmlSetupIterator->key()) { case 'special_char': // Log special characters $strDescription = '-- special characters "' . $xmlSetupIterator->current() . '"' . PHP_EOL; $strLine = ''; logLog(0, $strDescription, $strLine, $nLogModeSetupXml); break; case 'parameter': // Log parameters // $strDescription = '-- parameter "' . $xmlSetupIterator->current() . '"' . PHP_EOL; // $strLine = ''; // logLog(0, $strDescription, $strLine, 2); break; default: if (!$xmlSetupIterator->hasChildren()) { // XML-setup error, no exit
<pre> <?php $xmlIterator = new SimpleXMLIterator('<books><book>PHP basics</book><book>XML basics</book></books>'); print_r($xmlIterator->current()); echo var_dump($xmlIterator->key()); //bool(false) $xmlIterator->rewind(); // rewind to the first element print_r($xmlIterator->current()); echo var_dump($xmlIterator->key()); //string(4) "book" ?> </pre>
/** * @param SimpleXMLIterator $sxi */ public function sxiToArray($sxi) { $a = array(); for ($sxi->rewind(); $sxi->valid(); $sxi->next()) { if (!array_key_exists($sxi->key(), $a)) { $a[$sxi->key()] = array(); } if ($sxi->hasChildren()) { $a[$sxi->key()]['children'] = $this->sxiToArray($sxi->current()); } else { $a[$sxi->key()][] = strval($sxi->current()); } } return $a; }
function key() { return $this->it_actual->key(); }
/** * Convert XML iterator to array * * @static * @param \SimpleXMLIterator $xml * @param null $ns * @return array */ public static function xmlToArray(\SimpleXMLIterator $xml, $ns = null) { $a = []; for ($xml->rewind(); $xml->valid(); $xml->next()) { $key = $xml->key(); if (!isset($a[$key])) { $a[$key] = []; } foreach ($xml->current()->attributes() as $k => $v) { $a[$key][self::INDEX_ATTRIBUTES][$k] = (string) $v; } if ($ns) { foreach ($ns as $name) { foreach ($xml->current()->attributes($name) as $k => $v) { $a[$key][self::INDEX_ATTRIBUTES][$k] = (string) $v; } } } if ($xml->hasChildren()) { $a[$key][self::INDEX_CONTENT] = self::xmlToArray($xml->current(), $ns); } else { $a[$key][self::INDEX_CONTENT] = strval($xml->current()); } } return $a; }