Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../plugins/flow-flo.../libs/cakephp/utility
File: Xml.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
[2] Fix | Delete
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
[3] Fix | Delete
*
[4] Fix | Delete
* Licensed under The MIT License
[5] Fix | Delete
* For full copyright and license information, please see the LICENSE.txt
[6] Fix | Delete
* Redistributions of files must retain the above copyright notice.
[7] Fix | Delete
*
[8] Fix | Delete
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
[9] Fix | Delete
* @link https://cakephp.org CakePHP(tm) Project
[10] Fix | Delete
* @since 0.10.3
[11] Fix | Delete
* @license https://opensource.org/licenses/mit-license.php MIT License
[12] Fix | Delete
*/
[13] Fix | Delete
namespace Cake\Utility;
[14] Fix | Delete
[15] Fix | Delete
use Cake\Utility\Exception\XmlException;
[16] Fix | Delete
use DOMDocument;
[17] Fix | Delete
use DOMNode;
[18] Fix | Delete
use DOMText;
[19] Fix | Delete
use Exception;
[20] Fix | Delete
use SimpleXMLElement;
[21] Fix | Delete
[22] Fix | Delete
/**
[23] Fix | Delete
* XML handling for CakePHP.
[24] Fix | Delete
*
[25] Fix | Delete
* The methods in these classes enable the datasources that use XML to work.
[26] Fix | Delete
*/
[27] Fix | Delete
class Xml
[28] Fix | Delete
{
[29] Fix | Delete
/**
[30] Fix | Delete
* Initialize SimpleXMLElement or DOMDocument from a given XML string, file path, URL or array.
[31] Fix | Delete
*
[32] Fix | Delete
* ### Usage:
[33] Fix | Delete
*
[34] Fix | Delete
* Building XML from a string:
[35] Fix | Delete
*
[36] Fix | Delete
* ```
[37] Fix | Delete
* $xml = Xml::build('<example>text</example>');
[38] Fix | Delete
* ```
[39] Fix | Delete
*
[40] Fix | Delete
* Building XML from string (output DOMDocument):
[41] Fix | Delete
*
[42] Fix | Delete
* ```
[43] Fix | Delete
* $xml = Xml::build('<example>text</example>', ['return' => 'domdocument']);
[44] Fix | Delete
* ```
[45] Fix | Delete
*
[46] Fix | Delete
* Building XML from a file path:
[47] Fix | Delete
*
[48] Fix | Delete
* ```
[49] Fix | Delete
* $xml = Xml::build('/path/to/an/xml/file.xml');
[50] Fix | Delete
* ```
[51] Fix | Delete
*
[52] Fix | Delete
* Building XML from a remote URL:
[53] Fix | Delete
*
[54] Fix | Delete
* ```
[55] Fix | Delete
* use Cake\Http\Client;
[56] Fix | Delete
*
[57] Fix | Delete
* $http = new Client();
[58] Fix | Delete
* $response = $http->get('http://example.com/example.xml');
[59] Fix | Delete
* $xml = Xml::build($response->getStringBody());
[60] Fix | Delete
* ```
[61] Fix | Delete
*
[62] Fix | Delete
* Building from an array:
[63] Fix | Delete
*
[64] Fix | Delete
* ```
[65] Fix | Delete
* $value = [
[66] Fix | Delete
* 'tags' => [
[67] Fix | Delete
* 'tag' => [
[68] Fix | Delete
* [
[69] Fix | Delete
* 'id' => '1',
[70] Fix | Delete
* 'name' => 'defect'
[71] Fix | Delete
* ],
[72] Fix | Delete
* [
[73] Fix | Delete
* 'id' => '2',
[74] Fix | Delete
* 'name' => 'enhancement'
[75] Fix | Delete
* ]
[76] Fix | Delete
* ]
[77] Fix | Delete
* ]
[78] Fix | Delete
* ];
[79] Fix | Delete
* $xml = Xml::build($value);
[80] Fix | Delete
* ```
[81] Fix | Delete
*
[82] Fix | Delete
* When building XML from an array ensure that there is only one top level element.
[83] Fix | Delete
*
[84] Fix | Delete
* ### Options
[85] Fix | Delete
*
[86] Fix | Delete
* - `return` Can be 'simplexml' to return object of SimpleXMLElement or 'domdocument' to return DOMDocument.
[87] Fix | Delete
* - `loadEntities` Defaults to false. Set to true to enable loading of `<!ENTITY` definitions. This
[88] Fix | Delete
* is disabled by default for security reasons.
[89] Fix | Delete
* - `readFile` Set to false to disable file reading. This is important to disable when
[90] Fix | Delete
* putting user data into Xml::build(). If enabled local files will be read if they exist.
[91] Fix | Delete
* Defaults to true for backwards compatibility reasons.
[92] Fix | Delete
* - `parseHuge` Enable the `LIBXML_PARSEHUGE` flag.
[93] Fix | Delete
*
[94] Fix | Delete
* If using array as input, you can pass `options` from Xml::fromArray.
[95] Fix | Delete
*
[96] Fix | Delete
* @param string|array|object $input XML string, a path to a file, a URL or an array
[97] Fix | Delete
* @param array $options The options to use
[98] Fix | Delete
* @return \SimpleXMLElement|\DOMDocument SimpleXMLElement or DOMDocument
[99] Fix | Delete
* @throws \Cake\Utility\Exception\XmlException
[100] Fix | Delete
*/
[101] Fix | Delete
public static function build($input, array $options = [])
[102] Fix | Delete
{
[103] Fix | Delete
$defaults = [
[104] Fix | Delete
'return' => 'simplexml',
[105] Fix | Delete
'loadEntities' => false,
[106] Fix | Delete
'readFile' => true,
[107] Fix | Delete
'parseHuge' => false,
[108] Fix | Delete
];
[109] Fix | Delete
$options += $defaults;
[110] Fix | Delete
[111] Fix | Delete
if (is_array($input) || is_object($input)) {
[112] Fix | Delete
return static::fromArray($input, $options);
[113] Fix | Delete
}
[114] Fix | Delete
[115] Fix | Delete
if (strpos($input, '<') !== false) {
[116] Fix | Delete
return static::_loadXml($input, $options);
[117] Fix | Delete
}
[118] Fix | Delete
[119] Fix | Delete
if ($options['readFile'] && file_exists($input)) {
[120] Fix | Delete
return static::_loadXml(file_get_contents($input), $options);
[121] Fix | Delete
}
[122] Fix | Delete
[123] Fix | Delete
if (!is_string($input)) {
[124] Fix | Delete
$type = gettype($input);
[125] Fix | Delete
throw new XmlException("Invalid input. {$type} cannot be parsed as XML.");
[126] Fix | Delete
}
[127] Fix | Delete
[128] Fix | Delete
if (strpos($input, '<') !== false) {
[129] Fix | Delete
return static::_loadXml($input, $options);
[130] Fix | Delete
}
[131] Fix | Delete
[132] Fix | Delete
throw new XmlException('XML cannot be read.');
[133] Fix | Delete
}
[134] Fix | Delete
[135] Fix | Delete
/**
[136] Fix | Delete
* Parse the input data and create either a SimpleXmlElement object or a DOMDocument.
[137] Fix | Delete
*
[138] Fix | Delete
* @param string $input The input to load.
[139] Fix | Delete
* @param array $options The options to use. See Xml::build()
[140] Fix | Delete
* @return \SimpleXMLElement|\DOMDocument
[141] Fix | Delete
* @throws \Cake\Utility\Exception\XmlException
[142] Fix | Delete
*/
[143] Fix | Delete
protected static function _loadXml($input, $options)
[144] Fix | Delete
{
[145] Fix | Delete
$hasDisable = function_exists('libxml_disable_entity_loader');
[146] Fix | Delete
$internalErrors = libxml_use_internal_errors(true);
[147] Fix | Delete
if ($hasDisable && !$options['loadEntities']) {
[148] Fix | Delete
libxml_disable_entity_loader(true);
[149] Fix | Delete
}
[150] Fix | Delete
$flags = 0;
[151] Fix | Delete
if (!empty($options['parseHuge'])) {
[152] Fix | Delete
$flags |= LIBXML_PARSEHUGE;
[153] Fix | Delete
}
[154] Fix | Delete
try {
[155] Fix | Delete
if ($options['return'] === 'simplexml' || $options['return'] === 'simplexmlelement') {
[156] Fix | Delete
$flags |= LIBXML_NOCDATA;
[157] Fix | Delete
$xml = new SimpleXMLElement($input, $flags);
[158] Fix | Delete
} else {
[159] Fix | Delete
$xml = new DOMDocument();
[160] Fix | Delete
$xml->loadXML($input, $flags);
[161] Fix | Delete
}
[162] Fix | Delete
[163] Fix | Delete
return $xml;
[164] Fix | Delete
} catch (Exception $e) {
[165] Fix | Delete
throw new XmlException('Xml cannot be read. ' . $e->getMessage(), null, $e);
[166] Fix | Delete
} finally {
[167] Fix | Delete
if ($hasDisable && !$options['loadEntities']) {
[168] Fix | Delete
libxml_disable_entity_loader(false);
[169] Fix | Delete
}
[170] Fix | Delete
libxml_use_internal_errors($internalErrors);
[171] Fix | Delete
}
[172] Fix | Delete
}
[173] Fix | Delete
[174] Fix | Delete
/**
[175] Fix | Delete
* Parse the input html string and create either a SimpleXmlElement object or a DOMDocument.
[176] Fix | Delete
*
[177] Fix | Delete
* @param string $input The input html string to load.
[178] Fix | Delete
* @param array $options The options to use. See Xml::build()
[179] Fix | Delete
* @return \SimpleXMLElement|\DOMDocument
[180] Fix | Delete
* @throws \Cake\Utility\Exception\XmlException
[181] Fix | Delete
*/
[182] Fix | Delete
public static function loadHtml($input, $options = [])
[183] Fix | Delete
{
[184] Fix | Delete
$defaults = [
[185] Fix | Delete
'return' => 'simplexml',
[186] Fix | Delete
'loadEntities' => false,
[187] Fix | Delete
];
[188] Fix | Delete
$options += $defaults;
[189] Fix | Delete
[190] Fix | Delete
$hasDisable = function_exists('libxml_disable_entity_loader');
[191] Fix | Delete
$internalErrors = libxml_use_internal_errors(true);
[192] Fix | Delete
if ($hasDisable && !$options['loadEntities']) {
[193] Fix | Delete
libxml_disable_entity_loader(true);
[194] Fix | Delete
}
[195] Fix | Delete
$flags = 0;
[196] Fix | Delete
if (!empty($options['parseHuge'])) {
[197] Fix | Delete
$flags |= LIBXML_PARSEHUGE;
[198] Fix | Delete
}
[199] Fix | Delete
try {
[200] Fix | Delete
$xml = new DOMDocument();
[201] Fix | Delete
$xml->loadHTML($input, $flags);
[202] Fix | Delete
[203] Fix | Delete
if ($options['return'] === 'simplexml' || $options['return'] === 'simplexmlelement') {
[204] Fix | Delete
$flags |= LIBXML_NOCDATA;
[205] Fix | Delete
$xml = simplexml_import_dom($xml);
[206] Fix | Delete
}
[207] Fix | Delete
[208] Fix | Delete
return $xml;
[209] Fix | Delete
} catch (Exception $e) {
[210] Fix | Delete
throw new XmlException('Xml cannot be read. ' . $e->getMessage(), null, $e);
[211] Fix | Delete
} finally {
[212] Fix | Delete
if ($hasDisable && !$options['loadEntities']) {
[213] Fix | Delete
libxml_disable_entity_loader(false);
[214] Fix | Delete
}
[215] Fix | Delete
libxml_use_internal_errors($internalErrors);
[216] Fix | Delete
}
[217] Fix | Delete
}
[218] Fix | Delete
[219] Fix | Delete
/**
[220] Fix | Delete
* Transform an array into a SimpleXMLElement
[221] Fix | Delete
*
[222] Fix | Delete
* ### Options
[223] Fix | Delete
*
[224] Fix | Delete
* - `format` If create childs ('tags') or attributes ('attributes').
[225] Fix | Delete
* - `pretty` Returns formatted Xml when set to `true`. Defaults to `false`
[226] Fix | Delete
* - `version` Version of XML document. Default is 1.0.
[227] Fix | Delete
* - `encoding` Encoding of XML document. If null remove from XML header. Default is the some of application.
[228] Fix | Delete
* - `return` If return object of SimpleXMLElement ('simplexml') or DOMDocument ('domdocument'). Default is SimpleXMLElement.
[229] Fix | Delete
*
[230] Fix | Delete
* Using the following data:
[231] Fix | Delete
*
[232] Fix | Delete
* ```
[233] Fix | Delete
* $value = [
[234] Fix | Delete
* 'root' => [
[235] Fix | Delete
* 'tag' => [
[236] Fix | Delete
* 'id' => 1,
[237] Fix | Delete
* 'value' => 'defect',
[238] Fix | Delete
* '@' => 'description'
[239] Fix | Delete
* ]
[240] Fix | Delete
* ]
[241] Fix | Delete
* ];
[242] Fix | Delete
* ```
[243] Fix | Delete
*
[244] Fix | Delete
* Calling `Xml::fromArray($value, 'tags');` Will generate:
[245] Fix | Delete
*
[246] Fix | Delete
* `<root><tag><id>1</id><value>defect</value>description</tag></root>`
[247] Fix | Delete
*
[248] Fix | Delete
* And calling `Xml::fromArray($value, 'attributes');` Will generate:
[249] Fix | Delete
*
[250] Fix | Delete
* `<root><tag id="1" value="defect">description</tag></root>`
[251] Fix | Delete
*
[252] Fix | Delete
* @param array|object $input Array with data or a collection instance.
[253] Fix | Delete
* @param array $options The options to use.
[254] Fix | Delete
* @return \SimpleXMLElement|\DOMDocument SimpleXMLElement or DOMDocument
[255] Fix | Delete
* @throws \Cake\Utility\Exception\XmlException
[256] Fix | Delete
*/
[257] Fix | Delete
public static function fromArray($input, $options = [])
[258] Fix | Delete
{
[259] Fix | Delete
if (is_object($input) && method_exists($input, 'toArray') && is_callable([$input, 'toArray'])) {
[260] Fix | Delete
$input = call_user_func([$input, 'toArray']);
[261] Fix | Delete
}
[262] Fix | Delete
if (!is_array($input) || count($input) !== 1) {
[263] Fix | Delete
throw new XmlException('Invalid input.');
[264] Fix | Delete
}
[265] Fix | Delete
$key = key($input);
[266] Fix | Delete
if (is_int($key)) {
[267] Fix | Delete
throw new XmlException('The key of input must be alphanumeric');
[268] Fix | Delete
}
[269] Fix | Delete
[270] Fix | Delete
if (!is_array($options)) {
[271] Fix | Delete
$options = ['format' => (string)$options];
[272] Fix | Delete
}
[273] Fix | Delete
$defaults = [
[274] Fix | Delete
'format' => 'tags',
[275] Fix | Delete
'version' => '1.0',
[276] Fix | Delete
'encoding' => mb_internal_encoding(),
[277] Fix | Delete
'return' => 'simplexml',
[278] Fix | Delete
'pretty' => false,
[279] Fix | Delete
];
[280] Fix | Delete
$options += $defaults;
[281] Fix | Delete
[282] Fix | Delete
$dom = new DOMDocument($options['version'], $options['encoding']);
[283] Fix | Delete
if ($options['pretty']) {
[284] Fix | Delete
$dom->formatOutput = true;
[285] Fix | Delete
}
[286] Fix | Delete
self::_fromArray($dom, $dom, $input, $options['format']);
[287] Fix | Delete
[288] Fix | Delete
$options['return'] = strtolower($options['return']);
[289] Fix | Delete
if ($options['return'] === 'simplexml' || $options['return'] === 'simplexmlelement') {
[290] Fix | Delete
return new SimpleXMLElement($dom->saveXML());
[291] Fix | Delete
}
[292] Fix | Delete
[293] Fix | Delete
return $dom;
[294] Fix | Delete
}
[295] Fix | Delete
[296] Fix | Delete
/**
[297] Fix | Delete
* Recursive method to create childs from array
[298] Fix | Delete
*
[299] Fix | Delete
* @param \DOMDocument $dom Handler to DOMDocument
[300] Fix | Delete
* @param \DOMDocument|\DOMElement $node Handler to DOMElement (child)
[301] Fix | Delete
* @param array $data Array of data to append to the $node.
[302] Fix | Delete
* @param string $format Either 'attributes' or 'tags'. This determines where nested keys go.
[303] Fix | Delete
* @return void
[304] Fix | Delete
* @throws \Cake\Utility\Exception\XmlException
[305] Fix | Delete
*/
[306] Fix | Delete
protected static function _fromArray($dom, $node, &$data, $format)
[307] Fix | Delete
{
[308] Fix | Delete
if (empty($data) || !is_array($data)) {
[309] Fix | Delete
return;
[310] Fix | Delete
}
[311] Fix | Delete
foreach ($data as $key => $value) {
[312] Fix | Delete
if (is_string($key)) {
[313] Fix | Delete
if (is_object($value) && method_exists($value, 'toArray') && is_callable([$value, 'toArray'])) {
[314] Fix | Delete
$value = call_user_func([$value, 'toArray']);
[315] Fix | Delete
}
[316] Fix | Delete
[317] Fix | Delete
if (!is_array($value)) {
[318] Fix | Delete
if (is_bool($value)) {
[319] Fix | Delete
$value = (int)$value;
[320] Fix | Delete
} elseif ($value === null) {
[321] Fix | Delete
$value = '';
[322] Fix | Delete
}
[323] Fix | Delete
$isNamespace = strpos($key, 'xmlns:');
[324] Fix | Delete
if ($isNamespace !== false) {
[325] Fix | Delete
$node->setAttributeNS('http://www.w3.org/2000/xmlns/', $key, (string)$value);
[326] Fix | Delete
continue;
[327] Fix | Delete
}
[328] Fix | Delete
if ($key[0] !== '@' && $format === 'tags') {
[329] Fix | Delete
if (!is_numeric($value)) {
[330] Fix | Delete
// Escape special characters
[331] Fix | Delete
// https://www.w3.org/TR/REC-xml/#syntax
[332] Fix | Delete
// https://bugs.php.net/bug.php?id=36795
[333] Fix | Delete
$child = $dom->createElement($key, '');
[334] Fix | Delete
$child->appendChild(new DOMText((string)$value));
[335] Fix | Delete
} else {
[336] Fix | Delete
$child = $dom->createElement($key, $value);
[337] Fix | Delete
}
[338] Fix | Delete
$node->appendChild($child);
[339] Fix | Delete
} else {
[340] Fix | Delete
if ($key[0] === '@') {
[341] Fix | Delete
$key = substr($key, 1);
[342] Fix | Delete
}
[343] Fix | Delete
$attribute = $dom->createAttribute($key);
[344] Fix | Delete
$attribute->appendChild($dom->createTextNode((string)$value));
[345] Fix | Delete
$node->appendChild($attribute);
[346] Fix | Delete
}
[347] Fix | Delete
} else {
[348] Fix | Delete
if ($key[0] === '@') {
[349] Fix | Delete
throw new XmlException('Invalid array');
[350] Fix | Delete
}
[351] Fix | Delete
if (is_numeric(implode('', array_keys($value)))) {
[352] Fix | Delete
// List
[353] Fix | Delete
foreach ($value as $item) {
[354] Fix | Delete
$itemData = compact('dom', 'node', 'key', 'format');
[355] Fix | Delete
$itemData['value'] = $item;
[356] Fix | Delete
static::_createChild($itemData);
[357] Fix | Delete
}
[358] Fix | Delete
} else {
[359] Fix | Delete
// Struct
[360] Fix | Delete
static::_createChild(compact('dom', 'node', 'key', 'value', 'format'));
[361] Fix | Delete
}
[362] Fix | Delete
}
[363] Fix | Delete
} else {
[364] Fix | Delete
throw new XmlException('Invalid array');
[365] Fix | Delete
}
[366] Fix | Delete
}
[367] Fix | Delete
}
[368] Fix | Delete
[369] Fix | Delete
/**
[370] Fix | Delete
* Helper to _fromArray(). It will create childs of arrays
[371] Fix | Delete
*
[372] Fix | Delete
* @param array $data Array with information to create childs
[373] Fix | Delete
* @return void
[374] Fix | Delete
*/
[375] Fix | Delete
protected static function _createChild($data)
[376] Fix | Delete
{
[377] Fix | Delete
$data += [
[378] Fix | Delete
'dom' => null,
[379] Fix | Delete
'node' => null,
[380] Fix | Delete
'key' => null,
[381] Fix | Delete
'value' => null,
[382] Fix | Delete
'format' => null,
[383] Fix | Delete
];
[384] Fix | Delete
[385] Fix | Delete
$value = $data['value'];
[386] Fix | Delete
$dom = $data['dom'];
[387] Fix | Delete
$key = $data['key'];
[388] Fix | Delete
$format = $data['format'];
[389] Fix | Delete
$node = $data['node'];
[390] Fix | Delete
[391] Fix | Delete
$childNS = $childValue = null;
[392] Fix | Delete
if (is_object($value) && method_exists($value, 'toArray') && is_callable([$value, 'toArray'])) {
[393] Fix | Delete
$value = call_user_func([$value, 'toArray']);
[394] Fix | Delete
}
[395] Fix | Delete
if (is_array($value)) {
[396] Fix | Delete
if (isset($value['@'])) {
[397] Fix | Delete
$childValue = (string)$value['@'];
[398] Fix | Delete
unset($value['@']);
[399] Fix | Delete
}
[400] Fix | Delete
if (isset($value['xmlns:'])) {
[401] Fix | Delete
$childNS = $value['xmlns:'];
[402] Fix | Delete
unset($value['xmlns:']);
[403] Fix | Delete
}
[404] Fix | Delete
} elseif (!empty($value) || $value === 0 || $value === '0') {
[405] Fix | Delete
$childValue = (string)$value;
[406] Fix | Delete
}
[407] Fix | Delete
[408] Fix | Delete
$child = $dom->createElement($key);
[409] Fix | Delete
if ($childValue !== null) {
[410] Fix | Delete
$child->appendChild($dom->createTextNode($childValue));
[411] Fix | Delete
}
[412] Fix | Delete
if ($childNS) {
[413] Fix | Delete
$child->setAttribute('xmlns', $childNS);
[414] Fix | Delete
}
[415] Fix | Delete
[416] Fix | Delete
static::_fromArray($dom, $child, $value, $format);
[417] Fix | Delete
$node->appendChild($child);
[418] Fix | Delete
}
[419] Fix | Delete
[420] Fix | Delete
/**
[421] Fix | Delete
* Returns this XML structure as an array.
[422] Fix | Delete
*
[423] Fix | Delete
* @param \SimpleXMLElement|\DOMDocument|\DOMNode $obj SimpleXMLElement, DOMDocument or DOMNode instance
[424] Fix | Delete
* @return array Array representation of the XML structure.
[425] Fix | Delete
* @throws \Cake\Utility\Exception\XmlException
[426] Fix | Delete
*/
[427] Fix | Delete
public static function toArray($obj)
[428] Fix | Delete
{
[429] Fix | Delete
if ($obj instanceof DOMNode) {
[430] Fix | Delete
$obj = simplexml_import_dom($obj);
[431] Fix | Delete
}
[432] Fix | Delete
if (!($obj instanceof SimpleXMLElement)) {
[433] Fix | Delete
throw new XmlException('The input is not instance of SimpleXMLElement, DOMDocument or DOMNode.');
[434] Fix | Delete
}
[435] Fix | Delete
$result = [];
[436] Fix | Delete
$namespaces = array_merge(['' => ''], $obj->getNamespaces(true));
[437] Fix | Delete
static::_toArray($obj, $result, '', array_keys($namespaces));
[438] Fix | Delete
[439] Fix | Delete
return $result;
[440] Fix | Delete
}
[441] Fix | Delete
[442] Fix | Delete
/**
[443] Fix | Delete
* Recursive method to toArray
[444] Fix | Delete
*
[445] Fix | Delete
* @param \SimpleXMLElement $xml SimpleXMLElement object
[446] Fix | Delete
* @param array $parentData Parent array with data
[447] Fix | Delete
* @param string $ns Namespace of current child
[448] Fix | Delete
* @param string[] $namespaces List of namespaces in XML
[449] Fix | Delete
* @return void
[450] Fix | Delete
*/
[451] Fix | Delete
protected static function _toArray($xml, &$parentData, $ns, $namespaces)
[452] Fix | Delete
{
[453] Fix | Delete
$data = [];
[454] Fix | Delete
[455] Fix | Delete
foreach ($namespaces as $namespace) {
[456] Fix | Delete
foreach ($xml->attributes($namespace, true) as $key => $value) {
[457] Fix | Delete
if (!empty($namespace)) {
[458] Fix | Delete
$key = $namespace . ':' . $key;
[459] Fix | Delete
}
[460] Fix | Delete
$data['@' . $key] = (string)$value;
[461] Fix | Delete
}
[462] Fix | Delete
[463] Fix | Delete
foreach ($xml->children($namespace, true) as $child) {
[464] Fix | Delete
static::_toArray($child, $data, $namespace, $namespaces);
[465] Fix | Delete
}
[466] Fix | Delete
}
[467] Fix | Delete
[468] Fix | Delete
$asString = trim((string)$xml);
[469] Fix | Delete
if (empty($data)) {
[470] Fix | Delete
$data = $asString;
[471] Fix | Delete
} elseif (strlen($asString) > 0) {
[472] Fix | Delete
$data['@'] = $asString;
[473] Fix | Delete
}
[474] Fix | Delete
[475] Fix | Delete
if (!empty($ns)) {
[476] Fix | Delete
$ns .= ':';
[477] Fix | Delete
}
[478] Fix | Delete
$name = $ns . $xml->getName();
[479] Fix | Delete
if (isset($parentData[$name])) {
[480] Fix | Delete
if (!is_array($parentData[$name]) || !isset($parentData[$name][0])) {
[481] Fix | Delete
$parentData[$name] = [$parentData[$name]];
[482] Fix | Delete
}
[483] Fix | Delete
$parentData[$name][] = $data;
[484] Fix | Delete
} else {
[485] Fix | Delete
$parentData[$name] = $data;
[486] Fix | Delete
}
[487] Fix | Delete
}
[488] Fix | Delete
}
[489] Fix | Delete
[490] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function