doyhq66282 2013-12-16 23:41
浏览 22
已采纳

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

I have a XML that looks like this:

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

And I need to convert it to an object or array keeping the index attribute as key of the value.

Ex:

$lang = array (
  'default' => array (
     'name' => 'Full Name',
     'sex' => 'Gender'
  ),
  'es' => array (
     'name' => 'Nombre Completo',
     'sex' => 'Género'
  )
);

I tried with simplexml_load_file() but it eliminates the index and create numeric keys.

  • 写回答

2条回答 默认 最新

  • doufan9377 2013-12-17 01:35
    关注

    I'd use DomDocument. If the data structure will be exactly like given then you could

    $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("
    ", 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>';
    

    OUTPUT

    Array
    (
        [default] => Array
            (
                [name] => Full Name
                [sex] => Gender
            )
    
        [es] => Array
            (
                [name] => Nombre Completo
                [sex] => Género
            )
    
    )
    

    EDIT

    Changing the foreach you can find elements within previous results:

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

    This is more generic and easily adaptable for anything

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么