从XML节点获取数组

时间:2014-10-07 10:55:19

标签: php xml

我有这个xml摘录:

<Names>
<Name lang="en">Soccer</Name>
<Name lang="it">Calcio</Name>
</Names>

我想得到一个像这样的数组

$names = array(    
   "en" => "Soccer",
   "it" => "Calcio"
)

我尝试使用 simple_load_file(),然后遍历节点:

for($i=0;$i<count($xmlObject->Names->Name);$i++):
  $output[$xmlObject->Names->Name[$i]['lang'] = $xmlObject->Names->Name[$i];
endfor;

但不起作用。

2 个答案:

答案 0 :(得分:1)

获得类似你想要的数组的最快方法是:

$dom = simplexml_load_file($yourFile);
$result = array();
foreach ($dom as $node)
{//iterate over elements
    if ($node->getName() === 'Name')
    {//make sure to only process Name tags
         $lang = null;
         foreach ($node->attributes() as $name => $val)
         {//find the attribtues
             if ($name == 'lang')
             {//we have the lang attribute
                 $lang = (string) $val;//cast to string!
                 break;//we're done here
             }
         }
         if ($lang)
             $result[$lang] = (string) $node;//cast node to string to get its contents
    }
}
var_dump($result);

输出将是:

array(2) {
  ["en"]=>
  string(6) "Soccer"
  ["it"]=>
  string(6) "Calcio"
}

demo here

正如OIS在他的回答中建议的那样,你也可以使用SimpleXMLElement::xpath(),这可以让你消除那些丑陋的嵌套循环。除了他建议的XPath之外,我可能会采用这种方法:

foreach ($dom->xpath('//Name[@lang]') as $name)
    $result[(string) $name['lang']] = (string) $name;

答案 1 :(得分:1)

我只是使用xpath,因为我觉得更容易。使用[@lang],将仅选择具有属性lang的Name节点。编辑:因为那只是一个摘录,我做了//名字所以如果它不是root也会被发现。

$test = <<< EOF
<Names>
<Name lang="en">Soccer</Name>
<Name lang="it">Calcio</Name>
</Names>
EOF;

$xml = simplexml_load_string($test);
$arr = array();
foreach ($xml->xpath("//Names/Name[@lang]") as $node) {
    $arr[(string) $node["lang"]] = (string) $node;
}
var_dump($arr);

输出:

array(2) {
  ["en"]=>
  string(6) "Soccer"
  ["it"]=>
  string(6) "Calcio"
}