我有这个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;
但不起作用。
答案 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"
}
正如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"
}