将类似的属性添加到类似的子类SimpleXml

时间:2017-08-30 15:11:42

标签: php xml simplexml

我需要这样的XML:

<event id="8055107" tournament="40623">
   <fct id="1816" v="1.57" p="3" />
   <fct id="1696" v="1.2" p="3.5" />
   <fct id="703" v="9" />
   <fct id="1886" v="4.8" p="4.5"/>
   <fct id="1739" v="4.4" p="7.5"/> 
</event>

我试试这个却收到错误:

$this->parser = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><line></line>');
$this->parser->addChild('event');
$fcts = [[921, '1.5'], [922, '1.6'], [923, '1.7']];
foreach ($fcts as $fct) {
   $this->parser->event->addChild('fct')->addAttribute('id', $fct[0]);
   $this->parser->event->fct->addAttribute('v', $fct[1]);
}

错误是SimpleXMLElement :: addAttribute():属性已存在。请帮助。

2 个答案:

答案 0 :(得分:1)

$this->parser->event->fct是一个参考。您正尝试将属性设置为相同的元素fct

正确的方式:

...
foreach ($fcts as $fct) {
    $fct_node = $this->parser->event->addChild('fct');
    $fct_node->addAttribute('id', $fct[0]);
    $fct_node->addAttribute('v', $fct[1]);
}

http://php.net/manual/en/simplexmlelement.addchild.php

答案 1 :(得分:1)

该行

$this->parser->event->fct->addAttribute('v', $fct[1]);

将始终将v属性添加到文档中的第一个<fct>元素。

您需要先将新的子元素分配给变量,然后直接将属性添加到该变量:

foreach ($fcts as $fct) {
  $child = $parser->event->addChild('fct');
  $child->addAttribute('id', $fct[0]);
  $child->addAttribute('v', $fct[1]);
}