简体   繁体   English

SimpleXML属性到数组

[英]SimpleXML Attributes to Array

Is there any more elegant way to escape SimpleXML attributes to an array? 有没有更优雅的方法将SimpleXML属性转义为数组?

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

I don't really want to have to loop through it just to extract the key/value pair. 我真的不想只是为了提取键/值对而循环它。 All I need is to get it into an array and then pass it on. 我只需要将它放入一个数组然后传递它。 I would have thought attributes() would have done it by default, or at least given the option. 我原以为attributes()默认会这样做,或者至少给出选项。 But I couldn't even find the above solution anywhere, I had to figure that out on my own. 但我甚至无法在任何地方找到上述解决方案,我必须自己解决这个问题。 Am I over complicating this or something? 我是在复杂这个还是什么?

Edit: 编辑:

I'm still using the above script until I know for sure whether accessing the @attributes array is safe or not. 我仍然使用上面的脚本,直到我确定访问@attributes数组是否安全。

a more elegant way; 一种更优雅的方式; it gives you the same results without using $attributes[ '@attributes' ] : 它在不使用$ attributes ['@attributes']的情况下为您提供相同的结果:

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

Don't directly read the '@attributes' property, that's for internal use. 不要直接读取'@attributes'属性,这是供内部使用的。 Anyway, attributes() can already be used as an array without needing to "convert" to a real array. 无论如何, attributes()已经可以用作数组而无需“转换”为真实数组。

For example: 例如:

<?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"

If you want it to be a "true" array, you're gonna have to loop: 如果你想让它成为一个“真正的”数组,你将不得不循环:

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

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

You could convert the whole xml document into an array: 您可以将整个xml文档转换为数组:

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

For more information see: https://github.com/gaarf/XML-string-to-PHP-array 有关更多信息,请参阅: https//github.com/gaarf/XML-string-to-PHP-array

I think you will have to loop through. 我想你将不得不循环。 You can get it into array once you read xml. 一旦你读了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') ....
}

For me below method worked 对我来说下面的方法工作

function xmlToArray(SimpleXMLElement $xml)
{
    $parser = function (SimpleXMLElement $xml, array $collection = []) use (&$parser) {
        $nodes = $xml->children();
        $attributes = $xml->attributes();

        if (0 !== count($attributes)) {
            foreach ($attributes as $attrName => $attrValue) {
                $collection['@attributes'][$attrName] = strval($attrValue);
            }
        }

        if (0 === $nodes->count()) {
            if($xml->attributes())
            {
                $collection['value'] = strval($xml);
            }
            else
            {
                $collection = strval($xml);
            }
            return $collection;
        }

        foreach ($nodes as $nodeName => $nodeValue) {
            if (count($nodeValue->xpath('../' . $nodeName)) < 2) {
                $collection[$nodeName] = $parser($nodeValue);
                continue;
            }

            $collection[$nodeName][] = $parser($nodeValue);
        }

        return $collection;
    };

    return [
        $xml->getName() => $parser($xml)
    ];
}

This also provides me all the attributes as well, which I didn't get from any other method. 这也为我提供了所有属性,我没有从任何其他方法获得。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM