我有一个看起来像这样的XML:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<lang>
<data type="array">
<languageKey index="default" type="array">
<label index="name">Full Name</label>
<label index="sex">Gender</label>
</languageKey>
<languageKey index="es" type="array">
<label index="name">Nombre Completo</label>
<label index="sex">Género</label>
</languageKey>
</data>
</lang>
我需要将其转换为对象或数组,并将index属性保持为值的键。
前:
$lang = array (
'default' => array (
'name' => 'Full Name',
'sex' => 'Gender'
),
'es' => array (
'name' => 'Nombre Completo',
'sex' => 'Género'
)
);
我尝试使用simplexml_load_file()但它消除了索引并创建了数字键。
答案 0 :(得分:2)
我使用DomDocument
。如果数据结构与给定的完全相同,那么你可以
$xml = <<<XML
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<lang>
<data type="array">
<languageKey index="default" type="array">
<label index="name">Full Name</label>
<label index="sex">Gender</label>
</languageKey>
<languageKey index="es" type="array">
<label index="name">Nombre Completo</label>
<label index="sex">Género</label>
</languageKey>
</data>
</lang>
XML;
$dom = new DOMDocument();
@$dom->loadXML($xml);
$elements = $dom->getElementsByTagName('languageKey');
$return = array();
foreach($elements as $element){
$tokens = explode("\n", trim($element->nodeValue));
$key = $element->getAttribute('index');
$return[$key] = array(
'name' => trim($tokens[0]),
'sex' => trim($tokens[1])
);
}
echo '<pre>' . print_r($return, true) . '</pre>';
<强>输出强>
Array
(
[default] => Array
(
[name] => Full Name
[sex] => Gender
)
[es] => Array
(
[name] => Nombre Completo
[sex] => Género
)
)
修改强>
更改foreach
您可以在以前的搜索结果中找到元素:
foreach($elements as $element){
$key = $element->getAttribute('index');
// here we'll get label elements
$labels = $element->getElementsByTagname('label');
foreach($labels as $label){
// use index attribute as key
$key2 = $label->getAttribute('index');
$return[$key][$key2] = trim($label->nodeValue);
}
}
这更通用,更容易适应任何事情
答案 1 :(得分:0)
试图找出我开发此功能的解决方案:
// Carga un archivo XML de idioma y lo convierte en un array para su consulta.
function loadXMLfile($file){
// Carga el contenido del archivo.
$file_content = file_get_contents($file);
preg_match_all('/<languageKey(.+?)>(.+?)<\/languageKey>/is', $file_content, $lang_blocks);
// Obtiene las etiquetas de idioma.
foreach ($lang_blocks[1] as $meta_data){
preg_match_all('/index="(.+?)"/is', $meta_data, $lang);
$langs[] = $lang[1][0];
}
// Obtiene los textos
foreach ($lang_blocks[2] as $texts){
preg_match_all('/<label index="(.+?)">(.+?)<\/label>/is', $texts, $label);
$labels[] = array_combine($label[1],$label[2]);
}
return array_combine($langs,$labels);
}