Подтвердить что ты не робот

Атрибуты SimpleXML для массива

Есть ли более элегантный способ избежать атрибутов SimpleXML для массива?

$result = $xml->xpath( $xpath );
$element = $result[ 0 ];
$attributes = (array) $element->attributes();
$attributes = $attributes[ '@attributes' ];

Я действительно не хочу, чтобы он проходил через него только для того, чтобы извлечь пару ключ/значение. Все, что мне нужно - это получить его в массив, а затем передать его. Я бы подумал, что attributes() выполнил бы это по умолчанию или, по крайней мере, дал бы эту опцию. Но я даже не мог найти решение выше, я должен был это выяснить самостоятельно. Я чем-то усложняю это или что-то еще?

Edit:

Я все еще использую вышеуказанный script, пока не буду уверен, что доступ к массиву @attributes безопасен или нет.

4b9b3361

Ответ 1

Не читайте непосредственно свойство '@attributes', которое используется для внутреннего использования. В любом случае attributes() уже может использоваться как массив без необходимости "преобразовывать" в реальный массив.

Например:

<?php
$xml = '<xml><test><a a="b" r="x" q="v" /></test><b/></xml>';
$x = new SimpleXMLElement($xml);

$attr = $x->test[0]->a[0]->attributes();
echo $attr['a']; // "b"

Если вы хотите, чтобы он был "истинным" массивом, вам нужно зациклиться:

$attrArray = array();
$attr = $x->test[0]->a[0]->attributes();

foreach($attr as $key=>$val){
    $attrArray[(string)$key] = (string)$val;
}

Ответ 2

более элегантный способ; он дает вам те же результаты без использования $attributes ['@attributes']:

$attributes = current($element->attributes());

Ответ 3

Вы можете преобразовать весь XML-документ в массив:

$array = json_decode(json_encode((array) simplexml_load_string("<response>{$xml}</response>")), true);

Для получения дополнительной информации см. https://github.com/gaarf/XML-string-to-PHP-array

Ответ 4

Я думаю, вам придется пройти. Вы можете получить его в массив после чтения xml.

<?php
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
$arrData = array();

// if input is object, convert into array
if (is_object($arrObjData)) {
    $arrObjData = get_object_vars($arrObjData);
}

if (is_array($arrObjData)) {
    foreach ($arrObjData as $index => $value) {
        if (is_object($value) || is_array($value)) {
            $value = objectsIntoArray($value, $arrSkipIndices); // recursive call
        }
        if (in_array($index, $arrSkipIndices)) {
            continue;
        }
        $arrData[$index] = $value;
    }
}
return $arrData;
}

$xmlStr = file_get_contents($xml_file);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);

foreach($arrXml as $attr)
  foreach($attr as $key->$val){
 if($key == '@attributes') ....
}