foreach ($namespaces AS $nskey => $nsvalue)
$key .= " xmlns".($nskey == "" ? "":":").$nskey.'="'.$nsvalue.'"';
- $root = new SimpleXMLElement("<".$key."/>");
- self::from_array($value, $root, $remove_header, $namespaces, false);
+ if (is_array($value)) {
+ $root = new SimpleXMLElement("<".$key."/>");
+ self::from_array($value, $root, $remove_header, $namespaces, false);
+ } else
+ $root = new SimpleXMLElement("<".$key.">".xmlify($value)."</".$key.">");
$dom = dom_import_simplexml($root)->ownerDocument;
$dom->formatOutput = true;
}
foreach($array as $key => $value) {
- if ($key == "@attributes") {
+ if (!isset($element) AND isset($xml))
+ $element = $xml;
+
+ if (is_integer($key)) {
+ if (isset($element)) {
+ if (is_scalar($value)) {
+ $element[0] = $value;
+ } else {
+ /// @todo: handle nested array values
+ }
+ }
+ continue;
+ }
+
+ $element_parts = explode(":", $key);
+ if ((count($element_parts) > 1) AND isset($namespaces[$element_parts[0]]))
+ $namespace = $namespaces[$element_parts[0]];
+ elseif (isset($namespaces[""])) {
+ $namespace = $namespaces[""];
+ } else
+ $namespace = NULL;
+
+ // Remove undefined namespaces from the key
+ if ((count($element_parts) > 1) AND is_null($namespace))
+ $key = $element_parts[1];
+
+ if (substr($key, 0, 11) == "@attributes") {
if (!isset($element) OR !is_array($value))
continue;
else
$namespace = NULL;
- $element->addAttribute ($attr_key, $attr_value, $namespace);
+ $element->addAttribute($attr_key, $attr_value, $namespace);
}
continue;
}
- $element_parts = explode(":", $key);
- if ((count($element_parts) > 1) AND isset($namespaces[$element_parts[0]]))
- $namespace = $namespaces[$element_parts[0]];
- else
- $namespace = NULL;
-
if (!is_array($value))
$element = $xml->addChild($key, xmlify($value), $namespace);
elseif (is_array($value)) {
/**
* @brief Convert an XML document to a normalised, case-corrected array
* used by webfinger
- *
+ *
* @param object $xml_element The XML document
- * @param integer $recursion_depth recursion counter for internal use - default 0
+ * @param integer $recursion_depth recursion counter for internal use - default 0
* internal use, recursion counter
- *
+ *
* @return array | sring The array from the xml element or the string
*/
- public static function convert_element_to_array($xml_element, &$recursion_depth=0) {
+ public static function element_to_array($xml_element, &$recursion_depth=0) {
// If we're getting too deep, bail out
if ($recursion_depth > 512) {
$recursion_depth++;
$result_array[strtolower($key)] =
- self::convert_element_to_array($value, $recursion_depth);
+ self::element_to_array($value, $recursion_depth);
$recursion_depth--;
}
if ($recursion_depth == 0) {
/**
* @brief Convert the given XML text to an array in the XML structure.
- *
+ *
* xml::to_array() will convert the given XML text to an array in the XML structure.
* Link: http://www.bin-co.com/php/scripts/xml2array/
* Portions significantly re-written by mike@macgirvin.com for Friendica
* (namespaces, lowercase tags, get_attribute default changed, more...)
- *
+ *
* Examples: $array = xml::to_array(file_get_contents('feed.xml'));
* $array = xml::to_array(file_get_contents('feed.xml', true, 1, 'attribute'));
- *
+ *
* @param object $contents The XML text
* @param boolean $namespaces True or false include namespace information
* in the returned array as array elements.
- * @param integer $get_attributes 1 or 0. If this is 1 the function will get the attributes as well as the tag values -
+ * @param integer $get_attributes 1 or 0. If this is 1 the function will get the attributes as well as the tag values -
* this results in a different array structure in the return value.
* @param string $priority Can be 'tag' or 'attribute'. This will change the way the resulting
* array sturcture. For 'tag', the tags are given more importance.
- *
+ *
* @return array The parsed XML in an array form. Use print_r() to see the resulting array structure.
*/
public static function to_array($contents, $namespaces = true, $get_attributes=1, $priority = 'attribute') {