映射XML文件,将属性保存为键

时间:2013-12-16 23:41:29

标签: php xml arrays

我有一个看起来像这样的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()但它消除了索引并创建了数字键。

2 个答案:

答案 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);
}